我想使用dplyr mutate_at函数将函数应用于数据框中的多个列,其中函数输入直接应用的列以及数据帧中的另一列.
作为一个具体的例子,我想改变以下数据帧
# Example input dataframe
df <- data.frame(
x = c(TRUE, TRUE, FALSE),
y = c("Hello", "Hola", "Ciao"),
z = c("World", "ao", "HaOlam")
)
Run Code Online (Sandbox Code Playgroud)
与mutate_at调用类似于此
df %>%
mutate_at(.vars = vars(y, z),
.funs = ifelse(x, ., NA))
Run Code Online (Sandbox Code Playgroud)
返回一个看起来像这样的数据框
# Desired output dataframe
df2 <- data.frame(x = c(TRUE, TRUE, FALSE),
y_1 = c("Hello", "Hola", NA),
z_1 = c("World", "ao", NA))
Run Code Online (Sandbox Code Playgroud)
所需的mutate_at呼叫类似于以下呼叫mutate:
df %>%
mutate(y_1 = ifelse(x, y, NA),
z_1 = ifelse(x, z, NA)) …Run Code Online (Sandbox Code Playgroud) 我有一个带点分隔字符列的数据框:
> set.seed(310366)
> tst = data.frame(x=1:10,y=paste(sample(c("FOO","BAR","BAZ"),10,TRUE),".",sample(c("foo","bar","baz"),10,TRUE),sep=""))
> tst
x y
1 1 BAR.baz
2 2 FOO.foo
3 3 BAZ.baz
4 4 BAZ.foo
5 5 BAZ.bar
6 6 FOO.baz
7 7 BAR.bar
8 8 BAZ.baz
Run Code Online (Sandbox Code Playgroud)
我想将该列拆分为两个新列,其中包含点两侧的部分.str_split_fixed从包中stringr可以很好地完成这项工作.我的所有值肯定是用点分隔的两个部分,所以我可以这样做:
> require(stringr)
> str_split_fixed(tst$y,"\\.",2)
[,1] [,2]
[1,] "BAR" "baz"
[2,] "FOO" "foo"
[3,] "BAZ" "baz"
[4,] "BAZ" "foo"
[5,] "BAZ" "bar"
[6,] "FOO" "baz"
[7,] "BAR" "bar"
Run Code Online (Sandbox Code Playgroud)
现在我可以把cbind它放到我的数据框架上,但我想我会弄清楚如何在dplyr管道中做到这一点.首先,我认为mutate可以做到一个:
> tst %.% mutate(parts=str_split_fixed(y,"\\.",2))
Error: wrong …Run Code Online (Sandbox Code Playgroud) 我刚开始使用dplyr并且已经将我的一些plyr代码转换过来了.我喜欢新的语法,但是我无法让mutate()在一个列上逐列应用函数,例如:
library(Hmisc)
library(plyr)
library(dplyr)
t1 <- ddply(mtcars, .(cyl), transform, qrt=cut2(wt, g=4))
levels(t1$qrt) # works: different quartiles for each group
t2 <- mtcars %>% group_by(cyl) %>% mutate(qrt=cut2(wt, g=4))
levels(t2$qrt) # doesn't work: uses only 4 quartiles from the first group
Run Code Online (Sandbox Code Playgroud)
起初我认为第二个例子是使用整个wt列而不是cyl组,但它实际上似乎只使用第一组的四分位数并将它们分配给所有组,即使在wt范围之外.
我是否错过了wtmutate函数内部引用的一些语法?我可以让ddply版本适用于像sum()这样的函数,所以有什么东西cut2()导致问题吗?
我已经阅读了很多关于可能类似问题的帖子,并尝试在没有ddply加载的干净环境中运行dplyr版本等等.
谢谢你的帮助!
在这里查看答案 如何估计自举间隔?ggplot2列表上也提出了这个问题。
library(dplyr)
mtcars %>%
group_by(vs) %>%
summarise(mean.mpg = mean(mpg, na.rm = TRUE),
sd.mpg = sd(mpg, na.rm = TRUE),
n.mpg = n()) %>%
mutate(se.mpg = sd.mpg / sqrt(n.mpg),
lower.ci.mpg = mean.mpg - qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg,
upper.ci.mpg = mean.mpg + qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg)
Run Code Online (Sandbox Code Playgroud)