Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.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
在dplyr中插入列名_R_Dplyr_Names - Fatal编程技术网

在dplyr中插入列名

在dplyr中插入列名,r,dplyr,names,R,Dplyr,Names,假设我有一个包含许多列的数据帧:var1,…,var100,还有一个相同长度的匹配命名向量。 我想创建一个函数,如果在数据框中有NA,它将从命名向量中选取数据。这是我到目前为止写的: data %>% mutate(var1 = ifelse(is.na(var1), named_vec["var1"], var1), var2 = ifelse(is.na(var2), named_vec["var2"], var2), ...) 但是,如果我

假设我有一个包含许多列的数据帧:
var1
,…,
var100
,还有一个相同长度的匹配命名向量。
我想创建一个函数,如果在数据框中有NA,它将从命名向量中选取数据。这是我到目前为止写的:

data %>% 
  mutate(var1 = ifelse(is.na(var1), named_vec["var1"], var1),
         var2 = ifelse(is.na(var2), named_vec["var2"], var2),
         ...)
但是,如果我有100的变量,写这么多条件是非常不切实际的。然后我试了一下:

data %>% 
   mutate_if(~ifelse(is.na(.x), named_vec[colnames(.x)], .x))

Error in selected[[i]] <- eval_tidy(.p(column, ...)) : 
  more elements supplied than there are to replace
数据%>%
变异_-if(~ifelse(is.na(.x),命名为_-vec[colnames(.x)],.x))

所选[[i]]中出现错误使用
coalesce可能更容易做到这一点

library(dplyr)
library(purrr)
library(stringr)
nm1 <- str_c('var', 1:3)
data[nm1] <- map_dfc(nm1, ~ coalesce(data[[.x]], named_vec[.x]))
data
#  var1 var2 var3
#1    1    2    3
#2    1    2    3
#3    1    2    3
#4    1    2    3

您的代码不工作的结果也会有帮助。谢谢。我已经用
data%>%replace\u na(as.list(named\u vec))
library(dplyr)
library(purrr)
library(stringr)
nm1 <- str_c('var', 1:3)
data[nm1] <- map_dfc(nm1, ~ coalesce(data[[.x]], named_vec[.x]))
data
#  var1 var2 var3
#1    1    2    3
#2    1    2    3
#3    1    2    3
#4    1    2    3
data[] <-  coalesce(as.matrix(data), named_vec[col(data)])
library(tidyr)
data %>%
   mutate(rn = row_number()) %>%
   pivot_longer(cols = -rn) %>% 
   left_join(enframe(named_vec), by = 'name') %>%
   transmute(rn, name, value = coalesce(value.x, value.y)) %>% 
   pivot_wider(names_from = name, values_from = value) %>% 
   select(-rn)