在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)