我有下面提到的数据框:
注意:我在数据帧中有大约20万行,并希望在整个数据帧中运行逻辑。
ID Num MAX CH
1 22 A XCA-1
2 24 B VBS-1
3 54 A XCA-1
4 48 A XCA-1
5 88 C CXV-1
6 87 B VBS-1
7 98 A VBS-0
如何检查整个数据框中我们具有相同MAX
的每个CH
值,并添加一个具有状态的新列(即匹配或不匹配)。
必填数据框:
ID Num MAX CH ST
1 22 A XCA-1 Not Match
2 24 B VBS-7 Match
3 54 A XCA-1 Not Match
4 48 A XCA-1 Not Match
5 88 C CXV-4 Match
6 87 B VBS-7 Match
7 98 A VBS-0 Not Match
答案 0 :(得分:2)
如果我理解正确,你可以这样做:
transform(df, ST2 = ave(as.character(CH), MAX, FUN = function(x)
if(length(unique(x)) == 1) "Match" else "Not Match" ))
# ID Num MAX CH ST ST2
#1 1 22 A XCA-1 Not Match Not Match
#2 2 24 B VBS-7 Match Match
#3 3 54 A XCA-1 Not Match Not Match
#4 4 48 A XCA-1 Not Match Not Match
#5 5 88 C CXV-4 Match Match
#6 6 87 B VBS-7 Match Match
#7 7 98 A VBS-0 Not Match Not Match
答案 1 :(得分:1)
我们可以使用data.table
。在通过' MAX'进行分组后,获取' CH'的唯一编号。作为填充“不匹配”,“匹配”的逻辑向量。并将其分配给' ST2'创建列
library(data.table)
setDT(df1)[, ST2 := c("Not Match", "Match")[(uniqueN(CH) == 1) + 1], MAX]
df1
# ID Num MAX CH ST2
#1: 1 22 A XCA-1 Not Match
#2: 2 24 B VBS-1 Match
#3: 3 54 A XCA-1 Not Match
#4: 4 48 A XCA-1 Not Match
#5: 5 88 C CXV-1 Match
#6: 6 87 B VBS-1 Match
#7: 7 98 A VBS-0 Not Match
答案 2 :(得分:0)
我相信您有一个类别(MAX列),并且对于MAX中的每个条目,您要确定该类别是否具有列CH的唯一值。这并没有反映在您当前发布的示例中,但似乎就是您所说的。如果这是您想要的,可以使用group_by()
策略轻松完成:
library(tidyverse)
df <- data.frame(ID = 1:6,
MAX = c("A", "B", "A", "A", "C", "B"),
CH = c("A", "B", "A", "A", "C", "D"))
这里我创建了一个数据帧,其中CH的值在MAX == A或C时始终相同,但在等于B时则不一样。结果是:
df <- df %>% group_by(MAX) %>%
mutate(Match = ifelse(length(unique(CH))==1, "Match", "No Match"))
df
# A tibble: 6 x 4
# Groups: MAX [3]
ID MAX CH Match
<int> <fct> <fct> <chr>
1 1 A A Match
2 2 B B No Match
3 3 A A Match
4 4 A A Match
5 5 C C Match
6 6 B D No Match