【问题标题】:r - Using l_ply to add results to an existing data framer - 使用 l_ply 将结果添加到现有数据框
【发布时间】:2015-08-25 16:22:04
【问题描述】:

l_ply 或其他类似 apply 的函数是否能够将结果插入现有数据框?

这是一个简单的例子......

假设我有以下数据框:

mydata <- data.frame(input1=1:3, input2=4:6, result1=NA, result2=NA)

  input1 input2 result1 result2
1      1      4      NA      NA
2      2      5      NA      NA
3      3      6      NA      NA

我想遍历行,执行操作,然后在result1result2 列中插入答案。我试过了:

l_ply(1:nrow(mydata), function(i) {
  mydata[i,"result1"] <- mydata[i,"input1"] + mydata[i,"input2"]
  mydata[i,"result2"] <- mydata[i,"input1"] * mydata[i,"input2"]})

但我在结果列中取回了带有NA's 的原始数据框。

附:我已经读过这个post,但它并没有完全回答我的问题。我有几个结果列,我想要执行的操作比上面的操作更复杂,所以我更喜欢 not 单独计算列,然后将它们添加到数据框中作为帖子建议。

【问题讨论】:

  • library(dplyr); mydata %&gt;% mutate(result1 = input1 + input2, result2 = input1 * input2)
  • 你的计算比上面的复杂到什么程度? @Vlo 击败了我,你做到了。并不是我预期会有什么不同。
  • @maj 当我提到我的计算更复杂时,我的意思是 input1 是人口 ID 号,input2 表示抽样方法,input3 是样本大小。每个组合代表一个场景。我创建了计算每个场景的路径、样本、运行时等数量的函数。这是我想在结果列中生成的输出。
  • 在任何情况下,如果您在每一行上执行相同的操作,无论多么复杂,这意味着不对数据子集进行不同的处理,那么您可以使用@BondedDust 建议的解决方案和我自己,没有任何循环或 *apply 函数,也不一定使用 plyr,我个人觉得这经常很混乱。

标签: r plyr apply


【解决方案1】:

我想可能有一种 plyr 方法,但这在基础 R 中似乎非常容易和清晰:

> mydata[3:4] <- with(mydata, list( input1+input2, input1*input2) )
> mydata
  input1 input2 result1 result2
1      1      4       5       4
2      2      5       7      10
3      3      6       9      18

即使你得到了 plyr 代码来提供有用的东西,你仍然没有将结果分配给任何东西,所以它会在垃圾收集的耀眼阳光下蒸发。请注意,如果您遵循@Vlo 的建议,您会在控制台上看到可能导致您认为“mydata”已更新的结果,但“mydata”对象将保持不变。您需要将值分配回原始对象。对于 dplyr 操作,您通常会分配回整个对象。

【讨论】:

  • 非常感谢您的澄清。
【解决方案2】:

您无需使用apply 或其变体。相反,您可以利用 R 被矢量化:

mydata$result1 <- mydata$input1 + mydata$input2
mydata$result2 <- mydata$input1 * mydata$input2
#> mydata
#  input1 input2 result1 result2
#1      1      4       5       4
#2      2      5       7      10
#3      3      6       9      18

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2021-03-03
    • 2021-10-26
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多