【发布时间】:2018-08-02 21:16:27
【问题描述】:
在 R 中:我有一个包含 3 个数据框(Book1、Book2、Book3)的列表,列表名为 dflist4。我有一个代码要分别应用于列表中的每个数据帧,因为每个数据帧的 maxm 值都不同。我写了它,它有效,但只有当 Book1、Book2 和 Book3 都是相同大小的数据帧时。当它们的大小不相等时,代码将不会运行(错误:ops.dataframe == 仅针对大小相等的数据帧定义)。当我将 == 更改为 = 时,我知道这不合逻辑。无论数据框的大小如何,任何人都可以就如何根据名称从列表中选择数据框提出建议吗?
代码在这里:
eggplant<-function(x){
(if((x == (dflist4[["Book1"]])){
maxm = 3;
x %>% mutate(Col4 = (x[,3])/maxm);
})
(if((x == dflist4[["Book2"]])){
maxm = 2;
x %>% mutate(Col4 = (x[,3])/maxm);
})
(if((x == dflist4[["Book3"]])){
maxm = 1;
x %>% mutate(Col4 = (x[,3])/maxm);
})
}
test<-lapply(dflist4, eggplant)
【问题讨论】:
-
请提供示例数据(发布您的实际数据的最小代表性片段,或生成代表性示例数据的代码)。对于
Map/mapply或purrr::map2来说,这听起来很快。 -
您还将
dplyr与基本R 语法混合在一起:在mutate中,您应该按名称(如Col4)而不是按索引(如x[, 3])引用列。 -
谢谢!是 col3 是第三列。我现在正在阅读您的答案。为什么不能在 dplyr 中使用 R 基本语法?它有效...但不正确?
-
以例如
x %>% mutate(Col4 = (x[,3])/maxm):不要在mutate里面使用x;管道和dplyr语法的全部意义在于将转换连续应用于您调用一次的原始数据x。如果你必须这样做,你可以做x %>% mutate(Col4 = (.[[3]])/maxm),但这很丑。