2

我有一个包含两列的数据框。第一列定义数据的子集。我想在第二列中找到仅出现在第一列的一个子集中的所有值。

例如,来自:

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),]
4

4 回答 4

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”。

于 2012-06-03T19:33:10.970 回答
2

你有正确的想法duplicated。诀窍是结合fromLast = TRUEfromLast = 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
于 2012-06-03T20:04:36.547 回答
0

P Lapointe 答案的一个变体是

df[! df$data_values %in% df[duplicated( unique(df)$data_values ), ]$data_values,]

unique()处理数据中的某些行可能相同的可能性(不在您的测试数据中),如果相同的行没有出现在不同的(或不同的其他列)中,您希望将它们保留data_values一次data_sets

于 2012-06-03T23:07:55.607 回答
0

您可以使用“dplyr”和“explore”库来克服这个问题。

library(dplyr)
library(explore)

df=data.frame(
  data_subsets=rep(LETTERS[1:2],each=5),
  data_values=c(1,2,3,4,5,2,3,4,6,7))

df  %>% describe(data_subsets)

######## output ########
#variable = data_subsets
#type     = character
#na       = 0 of 10 (0%)
#unique   = 2
# A       = 5 (50%)
# B       = 5 (50%)
于 2021-10-25T04:55:24.337 回答