【问题标题】:R summarize unique values across columns based on values from one columnR根据一列中的值汇总列中的唯一值
【发布时间】:2015-05-05 18:48:44
【问题描述】:

我想根据 var_1 的值了解每列的唯一值总数。

例如:

Test <- data.frame(var_1 = c("a","a","a", "b", "b", "c", "c", "c", "c", "c"), var_2 = c("bl","bf","bl", "bl","bf","bl","bl","bf","bc", "bg" ), var_3 = c("cf","cf","eg", "cf","cf","eg","cf","dr","eg","fg"))

我正在寻找的结果将基于 var_1 中的值,应该是:

var_1 var_2 var_3
a     2     2
b     2     1
c     3     4

但是,在尝试了各种方法(包括应用和表)之后 - 聚合一直是最接近我正在寻找的东西,但是此脚本会汇总 var_1 的每个值的条目总数,但是总计不是唯一的

agbyv1= aggregate(. ~ var_1, Test, length) 

var_1 var_2 var_3
a     3     3
b     2     2
c     5     5

我试过了

unqbyv1= aggregate(. ~ var_1, Test, length(unique(x)))

但这没有用。

非常感谢任何帮助。

【问题讨论】:

  • 您的第二个aggregate 方法几乎是正确的!

标签: r unique aggregate


【解决方案1】:

试试

library(dplyr)
Test %>%
      group_by(var_1) %>% 
      summarise_each(funs(n_distinct(.)))

或者

library(data.table)#v1.9.5+
setDT(Test)[, lapply(.SD, uniqueN), var_1]

如果有 NAs

setDT(Test)[, lapply(.SD, function(x) uniqueN(na.omit(x))), var_1]

或者您可以使用aggregate。默认情况下,na.action=na.omit。所以,我们不需要任何修改。

aggregate(.~ var_1, Test, FUN=function(x) length(unique(x)) )

【讨论】:

  • 太棒了,效果很好。我将不得不更多地使用 dplyr,因为它似乎可以解决问题。祝你有美好的一天。
  • 刚刚注意到没有省略 NA 值,我该如何在其中添加那段脚本?我尝试在开头添加 na.omit() %>% 但这不起作用。
  • 在我的大型数据集中,我注意到使用此脚本不会省略 NA 值。我尝试在开头添加 na.omit() %>% 但这不起作用,因为它正在删除所有具有 na 值的行,而不是在倒数每一列时忽略它们。
  • 感谢您的额外帮助,但对于具有 NA 值的较大数据集仍然不合适。上面的聚合行删除了所有 NA 行,因此我得到了每列的一个非常简短的唯一计数。我只是希望它不计算 NA,而是计算每列中其余的唯一条目。
  • @Ina.Quest na.omit 可能应该靠近each-column 操作,就像n_distinct(na.omit(.)),我猜
【解决方案2】:

试试这个:

apply(Test[-1] , 2 , function(y) tapply(y,Test$var_1,function(x) length(unique(x))))

【讨论】:

  • 谢谢,它适用于我更大的数据集上面的 dummydata 我收到一个错误:tapply 中的错误(y,oh$RM,函数(x)长度(唯一(x))):参数必须具有相同的长度...知道这意味着什么吗?
  • 如果列名错误,@Ina.Quest oh$RM 的长度将为零。
  • @Erin - 我试过了: apply(oh[-1] , 2 , function(y) tapply(y,oh$RM,function(x) length(unique(x)))) -其中 oh 是我的数据集,RM 是我要排序的列。当我运行脚本时,我收到了上面发布的错误。
  • 如果不查看您的实际数据集,很难说出问题所在。
猜你喜欢
  • 1970-01-01
  • 2015-07-15
  • 2020-02-08
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多