【问题标题】:R: Summing frequency in a listR:列表中的求和频率
【发布时间】:2017-01-24 20:25:05
【问题描述】:

编辑:使用的包是:plyrvegan。 R 是最新版本。

我的基础数据是这样的:

X1 = c('Archea01', 'Bacteria01', 'Bacteria02') 
Sample1 = c(0.2,NA,NA) 
Sample2 = c(0, 0.001, NA) 
Sample3 = c(0.04, NA, NA)
df = data.frame(X1,Sample1,Sample2,Sample3)
df
          X1 Sample1 Sample2 Sample3
1   Archea01     0.2   0.000    0.04
2 Bacteria01      NA   0.001      NA
3 Bacteria02      NA      NA      NA

有目的地使用 NA 制作数据,以反映真实数据。

我的目标是总结每个样本中细菌/古细菌出现的频率,理想情况下这将创建这种类型的数据框:

Sample1    Sample2    Sample3
23         11         12

我已经创建了一个频率列表:

dfFreq <- apply(df, 2, count)

虽然这看起来不错,但这并不是我想要的:

head(dfFreq)[2]
$Sample2
         x    freq
1       0.000  23
2       0.001   5
3       <NA>   50  

下一个合乎逻辑的步骤是将列表转换为数据框和总频率(反之亦然),但我的代码没有工作。我试过了:

 df.data <- ldply (dfFreq, data.frame)
 dfSUM <- apply(dfFreq, 2, sum)

试图总结列表根本没有奏效(不足为奇)。关于转换为数据框,我查看了整个 Stack Overflow 并看到很多建议上述或lapply,但从建议的代码创建的数据框是:

 x           freq
 Archea01    1
 Bacteria01  1
 etc         etc

这不是我想要的。

关于如何 A) 对频率求和然后转换为我想要的数据框,或 B) 将列表转换为可以对频率列求和的合理数据框有什么想法吗?我认为 A 是我可以达到我想要的点的唯一方法,但是对此的任何想法将不胜感激。

编辑 2.0: Ryan Morton 建议使用以下代码:

require(dplyr)
dfBound <- rbind(dfFreq)

这导致了这个数据框:

        X1                                  Sample1
dfFreq list(x = 1:1885, freq = c(1, 1, 1)   list(x = c(1, 2, 3)

虽然这似乎更接近解决方案,但我注意到每个列表要么遵循 X1 的格式,要么遵循 Sample1 的格式(x = c(1,2,3, etc),这表明发生了错误绑定列表的过程。

关于为什么这可能不起作用的任何想法,以及对列表中找到的频率求和可能有什么解决方案?

非常感谢。

【问题讨论】:

  • 我不明白您提供的样本数据如何产生您提到的频率。请详细说明或提供匹配的数据/输出。此外,count 不是基本 R 函数。如果您正在使用任何软件包,请明确提及它们或添加它们的标签。
  • 我会 rbind() 数据帧列表,然后对频率求和。使用 dplyr 的 group_by 函数应该可以工作: df %>% group by(x) %>% summarise(freq = sum(freq)。如果需要通过样本名称,则需要将样本名称添加到每个数据帧(并将该变量添加到 group_by 函数)。
  • @lmo 对此感到抱歉-我所做的编辑是否使其更清晰?
  • @RyanMorton 非常感谢您。看起来它应该正是我正在寻找的东西。我明天试试,看看有没有效果。
  • @RyanMorton 代码对我来说没有用(请参阅上面的编辑)。知道为什么会这样吗?我想知道 NA 是否会影响命令...

标签: r list dataframe frequency vegan


【解决方案1】:

更新 我想出了如何对我的原始频率表求和并将其转换为我希望的数据帧。感谢 Ryan Morton 为我指明了正确的方向并提供了代码。

dfNARemoved <- lapply(dfFreq, function(x) transform(x[-nrow(x),]))#removing useless NAs in my data
dfFreqxRemoved <- lapply(dfNARemoved, function(x) { x["x"] <- NULL; x })     #removing useless x column
dfSum <- lapply(dfFreqxRemoved, function(x) sum(x))
require(dplyr)
#Now converting into a dataframe
dfBound <- rbind(dfSum)
dfData <- as.data.frame(dfBound)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多