【问题标题】:Apply functions using data from two different lists of data frames使用来自两个不同数据框列表的数据应用函数
【发布时间】:2016-05-25 18:14:30
【问题描述】:

我希望在对另一个数据框列表进行的计算中使用相关数据框列表中的数据。

目前,我的代码是这样的:

library(dplyr)

#Set up Dummy Data
types = c("A", "B", "C")
value = c(1, 2, 3, 4, 5, 6)
value3 = c(100, 150, 200, 250, 300, 350)
df_1 = data.frame(types, value, value3)

value2 = c(.1, .2, .3, .4, .5, .6)
value4 = c(.01, .02, .03, .04, .04, .06)
df_2 = data.frame(types, value2, value4)

#Split into lists
split1 = split(df_1, df_1$types)
split2 = split(df_2, df_2$types)

#run function inside of one list within each data frame.
split1 = lapply(split1, function(x) mutate(x, multiply = value * value3))
#run function inside of one list using data from corresponding data in different list
test = lapply(split2, function(x) select(x, value2))
lapply(split1, function(x) mutate(x, divide = value3/test)) 

最后一行代码生成错误“non-numeric argument to binary operator”。

【问题讨论】:

  • 您似乎为名为@9​​87654322@的函数使用了单独的包
  • 对于lapply(split1, function(x) mutate(x, divide = value3/test))test 是一个数据框列表,因此您试图将一个数值向量除以一个数据框列表。
  • 我已经编辑了原始问题以加载dplyr库并添加了lapplymapply标签。

标签: r lapply mapply


【解决方案1】:

问题有点不清楚,但您似乎想在公共列type 上加入两组数据,并使用两组中的值进行操作。由于您似乎已经在使用 dplyr 包,让我们使用它来连接两个数据框,然后使用 mutate() 创建新列(列名是 multiplydivide):

library(dplyr)    
df_1 %>% left_join(df_2, by = 'types') %>% mutate(multiply = value * value3, 
                                                        divide = value3/value2)

输出:

   types value value3 value2 value4 multiply    divide
1      A     1    100    0.1   0.01      100 1000.0000
2      A     1    100    0.4   0.04      100  250.0000
3      B     2    150    0.2   0.02      300  750.0000
4      B     2    150    0.5   0.04      300  300.0000
5      C     3    200    0.3   0.03      600  666.6667
6      C     3    200    0.6   0.06      600  333.3333
7      A     4    250    0.1   0.01     1000 2500.0000
8      A     4    250    0.4   0.04     1000  625.0000
9      B     5    300    0.2   0.02     1500 1500.0000
10     B     5    300    0.5   0.04     1500  600.0000
11     C     6    350    0.3   0.03     2100 1166.6667
12     C     6    350    0.6   0.06     2100  583.3333

【讨论】:

  • 我会进一步探索。我想尝试将每种类型保留在它们自己的数据框中,因为有一系列函数已经应用于我想要使用的单个数据框,而无需进行太多修改。如果我必须修改,我会的。
  • 明白了,谢谢 - 将来,提供所需输出的示例会有所帮助!
【解决方案2】:

由于您没有提供所需的输出,因此很难准确说出您想要什么,但从查看您的代码来看,您似乎想要在列表中的每个数据帧上添加另一个变量。为此,您只需稍微修改当前代码。只需将最后一行更改为:

res<-lapply(seq_along(split1), function(y, n, i) { 
                          mutate(y[[i]], divide = value3/as.data.frame(test[n[i]])) }, y=split1, n=names(split1)
             )

我们在这里所做的是将索引传递给lapply 函数,然后我们还将您的split1 对象和names(split1) 作为参数传递给函数。这样我们就可以按照我们想要的方式访问它们。结果是:

 res
[[1]]
  types value value3 multiply value2
1     A     1    100      100   1000
4     A     4    250     1000    625

[[2]]
  types value value3 multiply value2
2     B     2    150      300    750
5     B     5    300     1500    600

[[3]]
  types value value3 multiply   value2
3     C     3    200      600 666.6667
6     C     6    350     2100 583.3333

需要注意两点:(1) 名称不一样,我还没有弄清楚如何使用lapply 来做到这一点,但事后可以很容易地做到这一点:

names(res) &lt;- names(split1)

和 (2) 看起来新变量名为value2,但实际上它是divide,就像我们在mutate 中指定的那样。可见:

 names(res[[1]])
[1] "types"    "value"    "value3"   "multiply" "divide"  

这看起来像一个显示问题,几乎就像变量标签与变量名称,我不知道如何立即修复它,但您仍然可以通过以下方式访问值:

 res[[1]]["divide"]
  value2
1   1000
4    625

【讨论】:

  • 这是我正在寻找的输出类型。当我尝试您的代码时,我收到错误“与 STRSXP 不兼容”。
  • 我认为这是dplyr 的一个已知问题(请参阅stackoverflow.com/questions/21391113/…),您附上了吗?如果您尝试开始新的 R 会话或使用 detach("package:dplyr", unload=TRUE) 之类的方式将其分离
  • 重启和分离都试过了,还是报错。
  • 嗯,试试这个detach("package:dplyr", unload=TRUE) detach("package:plyr", unload=TRUE) library(plyr) - 分离plyrdplyr 然后只加载plyr
  • 或者您可以指定我们希望 plyrplyr::mutate 发生变异
【解决方案3】:

我相信你想要完成的是在两个不同的列表上应用一个函数,首先是两者的第一个元素,然后是两者的第二个元素,等等。

这就是mapply() 所做的。我已将您的最后一行代码替换为以下代码:

result = split1

result$divide = mapply(function(x, y) {x$value3 / y$value2}, split1, test)

我想你明白了。您可以尝试使用dplyr 来做同样的事情。

【讨论】:

    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多