在数据框的列中唯一

时间:2017-08-18 13:37:24

标签: r

来自像这样的数据框

DF <- read.table(text = "String  Found   Count
                 0-025823    0    1   
                 1-042055    1    1   
                 1-018396    1    2   
                 1-018396    1    2   
                 1-002984    1    3   
                 1-002984    1    3   
                 1-002984    1    3", header = TRUE) 

我想获得以下输出:

String  Found   Count   Desired output
0-025823    0    1       1
1-042055    1    1       1
1-018396    1    2       1
1-018396    1    2       0
1-002984    1    3       1
1-002984    1    3       0
1-002984    1    3       0

Desired output列显示从上到下的唯一值。找到的第一个唯一值将标记为1,其余(重复)将全部为0。

我在excel中使用了以下公式来获取excel中的输出:

=IF(COUNTIF($A$2:A2,A2)>1,0,1)
where the sequenceof columns is same as above.

我使用了循环,aggregatewithin函数,但这些函数没有达到预期效果。

3 个答案:

答案 0 :(得分:7)

您希望将重复值标记为0:

DF <- read.table(text = "String  Found   Count
                 0-025823    0    1   
                 1-042055    1    1   
                 1-018396    1    2   
                 1-018396    1    2   
                 1-002984    1    3   
                 1-002984    1    3   
                 1-002984    1    3", header = TRUE)

DF$unique <- 1 - duplicated(DF$String)
#    String Found Count unique
#1 0-025823     0     1      1
#2 1-042055     1     1      1
#3 1-018396     1     2      1
#4 1-018396     1     2      0
#5 1-002984     1     3      1
#6 1-002984     1     3      0
#7 1-002984     1     3      0

duplicated会返回逻辑值,我会在算术中使用TRUE / FALSE强制1 / 0

请注意,通常您不应强制转换为整数。您只需改为!duplicated(DF$String)

答案 1 :(得分:1)

假设您的数据框是df

df[,"Desired output"]=0
for(i in (1:nrow(df)))
{
  if(length(which(df[1:i,]$Count==df[i,"Count"]))==1)
  {  df[i,"Desired output"]=1
  }
  else
  { 
     df[i,"Desired output"]=0
  }
}

答案 2 :(得分:1)

Roland的解决方案比使用dplyr更快,但为了呈现另一种解决方案:

 library(dplyr)
 DF %>% group_by(String) %>%  mutate(unique = ifelse(row_number()==1,1,0))

# # A tibble: 7 x 4 
# # Groups:   String [4] 
#     String Found Count unique 
#     <fctr> <int> <int>  <dbl> 
# 1 0-025823     0     1      1 
# 2 1-042055     1     1      1 
# 3 1-018396     1     2      1 
# 4 1-018396     1     2      0 
# 5 1-002984     1     3      1 
# 6 1-002984     1     3      0 
# 7 1-002984     1     3      0