来自像这样的数据框
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.
我使用了循环,aggregate
和within
函数,但这些函数没有达到预期效果。
答案 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