我想在带有条件mutate的管道末尾将新列添加到另一个数据框。如果变量的长度为零,则在该列中添加破折号,否则添加内容。这是我绑定结果数据帧的循环的一部分,因此所有列表仅包含一项,这里的数据帧仅包含一行。
是否可以使用mutate将一列添加到管道中使用的列之外的数据框中?
我尝试使用在这里找到的提示来解决此问题:Combine mutate with conditional values
示例代码:
x <- "bbb"
y <- ""
end <- data.frame(a_col="aaa")
end <- x %>%
mutate (end, x_col = case_when(length()==0 ~ '-',
length()!=0 ~ .))
end <- y %>%
mutate (end, y_col = case_when(length()==0 ~ '-',
length()!=0 ~ .))
使用这两种方法,我得到以下信息:“ UseMethod(” mutate_“)中的错误: 没有适用于'mutate_'的适用方法应用于“字符”类的对象
“结束”数据框的预期结果:
a_col x_col y_col
1 aaa bbb -
答案 0 :(得分:1)
这是您想要的行为吗?
x <- "bbb"
y <- ""
end <- data.frame(a_col = "aaa")
end %>% mutate(x_col = case_when(nchar(x) == 0 ~ "-",
TRUE ~ x),
y_col = case_when(nchar(y) == 0 ~ "-",
TRUE ~ y))
a_col x_col y_col
1 aaa bbb -
我认为您想使用?nchar()
而不是?length()
,因此返回的是字符串中的字符数,而不是向量中的元素数。
您遇到的错误是因为您试图调用mutate(data = "bbb")
,但是mutate
要求data
参数是data.frame
或至少继承了它的类。 data.frame
。因此,当您尝试将其传递给character
时,它会抱怨。
这是在列表中捕获多个管道结果的另一种方法,它们在将新列绑定到现有数据帧之前执行空字符串替换。
pipe_results <- list()
pipe_results[["x"]] <- x # these names become column names
pipe_results[["y"]] <- y
map_dfc(pipe_results,
~ gsub("^$", "-", .)) %>%
bind_cols(end, .)