Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
purrr循环遍历一个数据帧的列,并有条件地替换另一个数据帧的值_R_If Statement_Purrr - Fatal编程技术网

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带有2
mutate
调用的代码块正是我试图做的,但是使用了一个循环。在实际数据中,
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))