purrr循环遍历一个数据帧的列,并有条件地替换另一个数据帧的值
使用以下数据purrr循环遍历一个数据帧的列,并有条件地替换另一个数据帧的值,r,if-statement,purrr,R,If Statement,Purrr,使用以下数据 library(tidyverse) df_fac <- data_frame("author_1" = c("Ted", "Fred", NA, "Jim", "Tim"), "role_1" = c("Faculty", "Faculty", "Staff", "Faculty", "Faculty"), "author_2" = c(NA, "Will", NA, "Bill", NA),
library(tidyverse)
df_fac <- data_frame("author_1" = c("Ted", "Fred", NA, "Jim", "Tim"),
"role_1" = c("Faculty", "Faculty", "Staff", "Faculty", "Faculty"),
"author_2" = c(NA, "Will", NA, "Bill", NA),
"role_2" = c("Staff", "Faculty", "Staff", "Faculty", "Staff"))
df_all <- data_frame("author_1" = c("Ted", "Fred", "Simon", "Jim", "Tim"),
"role_1" = c("Faculty", "Faculty", "Staff", "Faculty", "Faculty"),
"author_2" = c("Sam", "Will", "Noah", "Bill", "Luther"),
"role_2" = c("Staff", "Faculty", "Staff", "Faculty", "Staff"))
使用map\u df
我可以在df\u fac
中的列上进行迭代,但不能在df\u all
中进行迭代(正如您可以看到的,它是唯一的作者列1)
在绑定行中抛出错误(x,.id):与STRSXP不兼容
df_test <- pmap_chr(list(is.na(select(df_fac, matches("author.\\d$"))),
select(df_all, matches("author.\\d$")),
select(df_fac, matches("author.\\d$"))),
ifelse)
df_-test您可以使用map2_-df
同时循环两个列表。使用dplyr::coalsece
将有助于替换缺少的值。我使用select
来确保df\u all
中的列与df\u fac
相同,顺序也相同
map2_df(df_fac, select(df_all, one_of(names(df_fac))), ~coalesce(.x, .y))
使用pmap
时的情况也一样:
pmap_df(list(df_fac, select(df_all, one_of(names(df_fac)))), coalesce)
您还可以将ifelse
与map2
一起使用,以及公式符号来引用您正在使用的两个不同列表
map2_df(df_fac, select(df_all, one_of(names(df_fac))),
~ifelse(is.na(.x), .y, .x))
在您的示例中,似乎希望您的df\u测试
输出与df\u all
相同。您能改进它以更好地反映您的真实数据吗?问题是什么?另外:map
很棒,但您确定它适合您的需要吗?可能是一个*\u join()
或其他更重要的东西appropriate@apom带有2mutate
调用的代码块正是我试图做的,但是使用了一个循环。在实际数据中,df_fac
中的列和值不在df_all
中,反之亦然,因此我上面的示例需要输入缺少的作者姓名。我现在这样做其实没有什么问题,只是有很多重复的代码(我对一些其他变量做了同样的事情,结果是大约24个看起来非常相似的mutate
调用)。好的,还有一个问题:我们能安全地假设df_fac
和df_all
的顺序相同吗?如果我们以某种方式cbind()
它们,它们的行是否总是匹配?或者有一个变量可以连接吗?你有没有看一下map2
中同时循环两个列表的方法?@apom是的,它们的顺序是相同的这真是太棒了。必须用原始数据进一步细分,但这是一个很好的解决方案。感谢您学习map2
课程。
map2_df(df_fac, select(df_all, one_of(names(df_fac))), ~coalesce(.x, .y))
pmap_df(list(df_fac, select(df_all, one_of(names(df_fac)))), coalesce)
map2_df(df_fac, select(df_all, one_of(names(df_fac))),
~ifelse(is.na(.x), .y, .x))