使用条件将列更改为单独的数据框
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 %>% 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, .)
【讨论】:
这是我的预期输出,我将其添加到问题中以及更多解释。您的解决方案有效,但x
或 y
是管道的结果。我想将它们添加到单独的 end
数据帧中,并在其管道末端使用 mutate 。如果不保存x
和y
并建立一个新的管道来添加它们,这可能吗?谢谢
当然可以。 x
和 y
是来自同一个管道还是它们是不同的产品?
它们是分开的。谢谢!
用另一个策略更新了,抱歉我花了一段时间才回来:)以上是关于使用条件将列更改为单独的数据框的主要内容,如果未能解决你的问题,请参考以下文章