考虑这个简单的例子:
library(dplyr)
dataframe <- data_frame(helloo = c(1,2,3,4,5,6),
ooooHH = c(1,1,1,2,2,2),
ahaaa = c(200,400,120,300,100,100))
# A tibble: 6 x 3
helloo ooooHH ahaaa
<dbl> <dbl> <dbl>
1 1 1 200
2 2 1 400
3 3 1 120
4 4 2 300
5 5 2 100
6 6 2 100
Run Code Online (Sandbox Code Playgroud)
这里我想将函数ntile应用于包含的所有列oo,但我希望调用这些新列cat+相应的列.
我知道我能做到这一点
dataframe %>% mutate_at(vars(contains('oo')), .funs = funs(ntile(., 2)))
# A tibble: 6 x 3
helloo ooooHH ahaaa
<int> <int> <dbl>
1 1 1 200 …Run Code Online (Sandbox Code Playgroud) 关于dplyr Github repo已经存在一些问题,至少有一个相关的SO问题,但是没有一个问题完全覆盖了我的问题 - 我想.
tidyr::separate(我认为)不适合我的情况()有一个特殊情况的答案.do()".这是我的用例:我想计算精确的二项式置信区间
dd <- data.frame(x=c(3,4),n=c(10,11))
get_binCI <- function(x,n) {
rbind(setNames(c(binom.test(x,n)$conf.int),c("lwr","upr")))
}
with(dd[1,],get_binCI(x,n))
## lwr upr
## [1,] 0.06673951 0.6524529
Run Code Online (Sandbox Code Playgroud)
我可以完成这项工作,do()但我想知道是否有一种更具表现力的方式来做到这一点(感觉mutate() 可能有一个.n参数正在讨论总结() ...)
library("dplyr")
dd %>% group_by(x,n) %>%
do(cbind(.,get_binCI(.$x,.$n)))
## Source: local data frame [2 x 4]
## Groups: x, n
##
## x n lwr upr
## 1 3 10 0.06673951 0.6524529
## 2 4 11 0.10926344 0.6920953
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) 我有data.frame很多列的名称遵循一个模式。如:
df <- data.frame(
x_1 = c(1, NA, 3),
x_2 = c(1, 2, 4),
y_1 = c(NA, 2, 1),
y_2 = c(5, 6, 7)
)
Run Code Online (Sandbox Code Playgroud)
我想申请mutate_at对每对列执行相同的操作。如:
df %>%
mutate(
x = ifelse(is.na(x_1), x_2, x_1),
y = ifelse(is.na(y_1), y_2, y_1)
)
Run Code Online (Sandbox Code Playgroud)
有没有办法用mutate_at/做到这一点mutate_each?
这个:
df %>%
mutate_each(vars(x_1, y_1), funs(ifelse(is.na(.), vars(x_2, y_2), .)))
Run Code Online (Sandbox Code Playgroud)
我尝试过的各种变体都失败了。
该问题类似于在 dplyr mutate_at 调用中使用多列的函数,但不同之处在于函数调用的第二个参数不是单个列,而是 vars 中每列的不同列。
提前致谢。
我有按地区划分的不同候选人的选举结果。来源有每个候选人的票数和每个选区的总票数。我想添加每个候选人在每个选区获得的选票百分比的变量。
我已经成功地使用mutatewithacross将投票计数替换为百分比,但是在尝试使用参数创建新变量时出现错误.names(即我希望获得新变量,,,,cand1_pct... cand2_pct)。
library(tidyverse)
df <- data.frame(district = 1:3,
cand1 = c(12, 2, 14),
cand2 = c(2, 6, 23),
cand3 = c(3, 16, 2),
total = c(17, 24, 39))
df %>%
mutate(across(2:4, ~ .x/total*100))
#> district cand1 cand2 cand3 total
#> 1 1 70.588235 11.76471 17.647059 17
#> 2 2 8.333333 25.00000 66.666667 24
#> 3 3 35.897436 58.97436 5.128205 39
df %>%
mutate(across(2:4, ~ .x/total*100, .names = "{.col}_pct"))
#> Error: …Run Code Online (Sandbox Code Playgroud) 我有一个5列的数据框,我想产生4个额外的列,给出我最后4列和第1列之间的差异.我尝试了以下,但这不起作用:
library(tidyverse)
df <- as.tibble(data.frame(A = c(1,2), B = c(3,4), C = c(4,5), D = c(2,3), E = c(4,5)))
r_diff <- function(x,y){
z = y - x
return(z)
}
vars_to_process <- c("B","C","D","E")
df %>% mutate_at(.cols=vars_to_process, .funs =r_diff(.,df[,1])) %>% head()
Run Code Online (Sandbox Code Playgroud)
谢谢Renger