我有一个包含两列的数据框。第一列定义数据的子集。我想在第二列中找到仅出现在第一列中的一个子集中的所有值。
例如,来自:
df=data.frame(
data_subsets=rep(LETTERS[1:2],each=5),
data_values=c(1,2,3,4,5,2,3,4,6,7))
data_subsets data_values
A 1
A 2
A 3
A 4
A 5
B 2
B 3
B 4
B 6
B 7
我想提取以下数据框。
data_subsets data_values
A 1
A 5
B 6
B 7
我一直在玩duplicated
,但我似乎无法使其发挥作用。任何帮助表示赞赏。有很多主题可以解决类似的问题,我希望我在搜索中没有忽略答案!
修改的
我修改了@Matthew Lundberg的方法,即计算元素的数量并从数据框中提取。出于某种原因,他的方法不适合我的数据框架,所以我想出了这个,这不太优雅,但完成工作:
counts=rowSums(do.call("rbind",tapply(df$data_subsets,df$data_values,FUN=table)))
extract=names(counts)[counts==1]
df[match(extract,df$data_values),]
答案 0 :(得分:5)
首先,找到df $ data_values中每个元素的计数:
x <- sapply(df$data_values, function(x) sum(as.numeric(df$data_values == x)))
> x
[1] 1 2 2 2 1 2 2 2 1 1
现在提取行:
> df[x==1,]
data_subsets data_values
1 A 1
5 A 5
9 B 6
10 B 7
请注意,您错过了上面的“A 5”。没有“B 5”。
答案 1 :(得分:2)
您对duplicated
有正确的想法。诀窍是结合fromLast = TRUE
和fromLast = FALSE
选项来获取非重复行的完整列表。
!duplicated(df$data_values,fromLast = FALSE)&!duplicated(df$data_values,fromLast = TRUE)
[1] TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE TRUE
使用此向量索引data.frame给出:
df[!duplicated(df$data_values,fromLast = FALSE)&!duplicated(df$data_values,fromLast = TRUE),]
data_subsets data_values
1 A 1
5 A 5
9 B 6
10 B 7
答案 2 :(得分:0)
P Lapointe答案的变体是
df[! df$data_values %in% df[duplicated( unique(df)$data_values ), ]$data_values,]
unique()
处理数据中某些行可能相同的可能性(不在您的测试数据中),如果相同的data_values
没有显示为data_sets
,则您希望保留一次{1}}(或其他不同的列)。