使用条件将列更改为单独的数据框

Posted

技术标签:

【中文标题】使用条件将列更改为单独的数据框【英文标题】:Mutate column into separate data frame using a condition 【发布时间】:2018-12-14 07:44:59 【问题描述】:

我想在管道末端添加新列到另一个数据框,并使用条件进行变异。如果变量的长度为零,则在列中添加破折号,否则添加内容。这是我绑定结果数据框的循环的一部分,因此所有列表只有一项,而这里的数据框只有一行。

是否可以通过 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     -

【问题讨论】:

嘿,在您的mutate 命令中,您的结构不正确。你应该使用x %&gt;% mutate(x_col = case_when(length == 0 ~ '-', length() != 0 ~ .))。更不用说,这不是你应该走的路。您可能想查看dplyr 包中的if_else 谢谢!是否可以使用 mutate 将列添加到管道中的数据框以外的数据框中? 【参考方案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, .)

【讨论】:

这是我的预期输出,我将其添加到问题中以及更多解释。您的解决方案有效,但 xy 是管道的结果。我想将它们添加到单独的 end 数据帧中,并在其管道末端使用 mutate 。如果不保存xy 并建立一个新的管道来添加它们,这可能吗?谢谢 当然可以。 xy 是来自同一个管道还是它们是不同的产品? 它们是分开的。谢谢! 用另一个策略更新了,抱歉我花了一段时间才回来:)

以上是关于使用条件将列更改为单独的数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何将列更改为行

如何将列更改为行[重复]

访问 SQL - 将列更改为自动编号?

将列更改为常规列而不是外键

SQL Server 2008 - 从 Float 将列更改为 Varchar 产生科学记数法

Postgresql以通用方式将列更改为行