使用条件将列突变为单独的数据框

时间:2018-07-05 18:34:36

标签: r if-statement dplyr conditional-statements mutate

我想在带有条件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     -

1 个答案:

答案 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, .)