【问题标题】:apply calculation on multiple columns of each element in a list对列表中每个元素的多列应用计算
【发布时间】:2013-08-26 10:36:07
【问题描述】:

我有一个包含 23 个元素的列表,每个元素有 69 行和 13 列。而且我需要为列表的每个元素在多列上应用计算。

作为一个简单的例子,我的列表如下所示:

>list
>$`1` 
>       a       b     c 
>1    2.1    1.4    3.4 
>2    4.4    2.6    5.5 
>3    2.6    0.4    3.0 
... 

>$`2` 
>      a       b        c 
>70    5.1    4.9    5.1 
>71    4.4    7.6    8.5 
>72    2.8    3.5    6.8 
... 

我想做的是z = (a-b) / c 对于每个元素 ($1,$2..., $23)

我尝试了以下代码:

for(i in 1:23) {
z = (列表[[i]]$a - 列表[[i]]$b) / 列表[[i]]$c }

它只给了我 49 个值,而不是 1566 个值。

有人知道我的代码出了什么问题并能够纠正它吗? 非常感谢你!

【问题讨论】:

  • 您每次都在覆盖z。尝试将z 设为列表并编写z[[i]]<- (samestuff)
  • @Carl Witthoft 我使用代码z = vector("list", 23) 创建了一个列表。谢谢你的建议。

标签: r list for-loop


【解决方案1】:

您可以使用函数lapply() 来实现。这是假设在所有数据框中列具有相同名称的示例。

ll<-list(data.frame(a=1:3,b=4:6,c=7:9),
         data.frame(a=1:3,b=6:4,c=7:9),
         data.frame(a=1:3,b=4:6,c=9:7))

lapply(ll, with, (a-b)/c)

【讨论】:

  • 感谢您的回复。听起来可能很愚蠢,但您能否澄清一下“1:3”、“4:6”、“7:9”代表什么,以便我可以用我的真实数据集复制您建议的代码?顺便说一句,原始数据不是数据框而是列表。谢谢!
  • @cactussss 由于您没有提供我刚刚制作的数据的可重现示例,因此我可能拥有。 ll 是由三个列表元素组成的列表,其中每个元素都是数据框。
  • 我明白了。谢谢您的回答。它完美地工作!作为后续问题-如何将列表中的无限值替换为零?我尝试了list[is.infinite] == 0,它给了我以下错误消息“列表[is.infinite] 中的错误:无效的下标类型'builtin'”。顺便说一句,我的列表不包含数据框,而是列表。
【解决方案2】:

处理@DidzisElferts 的答案,你可以使用这个

lapply(ll, within, z <- (a-b)/c)

z 添加为每个数据帧的新列。

【讨论】:

  • 感谢您的回答费迪南德。但是如果我的列表中的元素不是数据框(我的列表中有 23 个列表)怎么办?更具体地说,命令class(list[[1]]) 给了我结果"list"。您对如何有效地将它们转换为数据框有任何想法吗?谢谢。
  • 我想要做的只是改变列表元素的类别,但将整个数据集分组(比如从 2​​3 个列表的列表到 23 个数据框的列表)
  • 如果您的列表元素是列表本身,具有相同长度的向量,您可以使用lapply(ll, as.data.frame)将它们转换为数据帧。
猜你喜欢
  • 2020-11-05
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
相关资源
最近更新 更多