检查相同的值,我们在R中的其他列中具有相同的唯一值

时间:2018-02-14 09:27:56

标签: r dataframe

我有下面提到的数据框:

注意:我在数据帧中有大约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

3 个答案:

答案 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
相关问题