【发布时间】:2018-04-14 15:41:15
【问题描述】:
我希望有人能帮助我找到我在 R 中的代码遇到的令人沮丧的问题的根源。我有一个由数据框组成的列表,我想离开加入每个两个 OTHER 数据帧之一上的元素(称为 A 和 B)。要加入哪些辅助数据帧取决于元素在列表中的位置。出于我的目的,我希望每个奇数元素左连接到 A,每个偶数元素左连接到 B。
library(dplyr)
DF <- data.frame(Num = c("1","2"), Let = c("a","b"), stringsAsFactors = FALSE)
A <- data.frame(Let = c("a","b"), Col = c("Yellow","Red"), stringsAsFactors = FALSE)
B <- data.frame(Let = c("a","b"), Col = c("Green","Blue"), stringsAsFactors = FALSE)
LIST <- list(DF, DF)
到目前为止,我尝试了两种不同的方式。第一种方法涉及 if-else 语句。如果我应用这样的语句来根据位置分配一个整数值,我会得到预期的结果。同样,当我离开 使用 if-else 语句,只需在列表上执行一系列左连接 元素,一切都按预期工作。
lapply(seq_along(LIST), function(x, {ifelse((x %% 2)==0, y[[x]] <- 1, y[[x]] <- 2)}, y = LIST)
lapply(seq_along(LIST), function(x, {left_join(y[[x]], A, by = c("Let"))}, y = LIST)
当我尝试将 if-else 语句和左连接结合起来时,我遇到了问题。特别是,我最终得到一个由列表组成的列表,每个 其中只保留原始对应数据框的第一列。
lapply(seq_along(LIST), function(x, y) {ifelse((x %% 2)==0, left_join(y[[x]], A, by = c("Let")), left_join(y[[x]], B, by = c("Let")))}, y = LIST)
这是我想要获得的输出:
[[1]]
Let Num Col
1 a 1 Yellow
2 b 2 Red
[[2]]
Let Num Col
1 a 1 Green
2 b 2 Blue
我确信这个问题有一个非常简单的解决方案。有人能看吗?
提前致谢! 马修
P.S.:我还尝试了第二种方法,应用子集而不是 if-else 语句。然而,我又遇到了问题。下面的第一行按预期工作,但第二行返回错误,好像 R 无法识别列表索引:
lapply(seq_along(LIST), function(x, y) {left_join(y[[x > 0]], A, by = c("Let"))}, y = LIST)
lapply(seq_along(LIST), function(x, y) {left_join(y[[x == 1]], A, by = c("Let"))}, y = LIST)
Error in y[[x == 1]] : attempt to select less than one element in integerOneIndex
【问题讨论】:
-
您能否编辑您的帖子以包含您的预期输出。前两个
lapply语句抛出错误。 -
您好 Maurits Evers - 感谢您的及时回复!我已按照您的要求编辑了问题。前两个语句抛出错误,因为我心不在焉地忘记调用 dplyr。
-
顺便说一句,与其反复说你不要
stringsAsFactors,不如说library(hellno)lol -
install.packages("hellno") 抛出错误:p
标签: r if-statement left-join lapply