【问题标题】:Counting frequency of value in a column in a data frame in R not giving expected results计算R中数据框中列中值的频率未给出预期结果
【发布时间】:2015-01-18 10:19:13
【问题描述】:

我有两个数据框,一个小,一个大。尺寸如下。基本上,我希望看到列中的值以及它的频率,并且我希望在较大的数据框中有一个更高的数字,而不是在较小的数据框中。

> length(smalldf$col1)
[1] 5377
> length(largedf$col1)
[1] 56016

现在,当我尝试查找每个值中唯一值的数量时,我得到以下信息。现在,这个结果并不像预期的那样,我确信与较小的数据帧相比,较大的数据帧中有更多的 new(unique) 值。

> length(unique(smalldf$col1))
[1] 4697
> length(unique(largedf$col1))
[1] 4698

如果我打印出唯一值,我会得到 largedf,其中所有 4697 个元素都是 smalldf 加上最后的 NA。

所以,我尝试打印较大数据框中的值,这些值不属于较小数据框的一部分,但我只是将所有列的 NA 作为它的值

> library('plyr')
> a1NotIna2 <- sqldf('SELECT * FROM largedf EXCEPT SELECT * FROM smalldf')
> a1NotIna2

只给我所有反对它的 NA 专栏

最后,我尝试在大数据框中找到每个值的频率。 我得到了相同的结果

【问题讨论】:

  • 你能检查一下 NA 是不是字符吗? sum(is.na(largedf$col1))
  • @akrun,对不起,我努力提供一个可重现的例子,但由于我正在从一个巨大的数据文件中读取,我无法做到。当我运行命令时,你让我这样做,我得到数字 50639。这是什么意思?
  • 表示该列有 50639 个 NA 值。所以,本质上是56016-50639#[1] 5377
  • @akrun,我认为这与以下命令有关。创建大数据框是为了从总数据集(数据框)中查找第 19 列或第 20 列包含特定值 4820 的那些行。这是我使用的命令。这里有什么问题吗? largedf = totaldataset[which(totaldataset[,c(19:20)] == "4280"),].在较小的数据集上,它可以工作,因为我只在第 19 列中查找值 4820。并使用 smalldata = totaldataset[which(totaldataset[,19] == "4280 "),] 之类的东西。我哪里错了?
  • 我想你可以试试largedf &lt;- totaldataset[totaldataset[,19]=='4280'|totaldataset[,20=='4280',]。如果列是数字,4280 不需要引号

标签: r rstudio


【解决方案1】:

你可以试试

largedf <- totaldataset[Reduce(`|`, lapply(totaldataset[19:43], 
                     function(x) x=='4280')), ]

【讨论】:

  • 它有效 :) 谢谢。为了未来读者的利益,您可以添加缺少的右括号。所以,它看起来像 largedf |, lapply(totaldataset[19:43], function(x) x=='4280')), ]
  • @IAMTubby 感谢您提及缺少的括号。抱歉,我没有测试代码:-)
猜你喜欢
  • 2022-11-28
  • 2022-01-27
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多