根据R中的唯一值对数据进行子集

时间:2016-11-10 08:17:44

标签: r dataframe

我的数据如下

test=data.frame("name"=c("A","A","A","A","B","B","C"), value=c(10,11,12,13,14,15,16))

我希望根据非重复名称" C"对测试数据进行子集化,我想显示以下数据:

name value
   c    16

我尝试test[table(test$name)>1,],但输出错误。

请给我一些提示,谢谢!!

4 个答案:

答案 0 :(得分:4)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(test)),按'name'分组,if行数等于1(.N==1),子集data.table。

library(data.table)
setDT(test)[, if(.N==1) .SD, by = name]
#   name value
#1:    C    16

答案 1 :(得分:2)

我们可以在ave中尝试base R功能,只选择length = 1

test[ave(test$value, test$name, FUN = function(x) length(x)) == 1, ]

# name value
#7    C    16

dplyr

library(dplyr)
test %>%
   group_by(name) %>%
   filter(n() == 1)

#   name value
#   <fctr> <dbl>
#1     C    16

答案 2 :(得分:2)

使用data.frame

table.freq <- as.data.frame(table(test$name))
test[test$name %in% table.freq$Var1[table.freq$Freq==1],]
#  name value
#7    C    16

或使用which

test[test$name %in% names(which(table(test$name)==1)),]
#  name value
#7    C    16

答案 3 :(得分:2)

这是data.frame的替代代码:

test <-
  data.frame(
   name = c("A", "A", "A", "A", "B", "B", "C", "D"),
   value = c(10, 11, 12, 13, 14, 15, 16, 17)
)

test[test$name == unique(test$name)[table(test$name) == 1], ]
# Answer:
# name value
# 7    C    16
# 8    D    17

或者:

test[test$name == names(table(test$name))[table(test$name) == 1], ]