我有一个数据:
df_1 <- data.frame(
x = replicate(4, runif(30, 20, 100)),
y = sample(1:3, 30, replace = TRUE)
)以下功能工作:
library(tidyverse)
df_1 %>%
select(-y) %>%
rowwise() %>%
mutate(var = sum(c(x.1, x.3)))但是,以下函数(对于所有变量)都不起作用:
带.**:**的
df_1 %>%
select(-y) %>%
rowwise() %>%
mutate(var = sum(.))带select_if**:**的
df_1 %>%
select(-y) %>%
rowwise() %>%
mutate(var = sum(select_if(., is.numeric)))这两种方法都返回:
Source: local data frame [30 x 5]
Groups: <by row>
# A tibble: 30 x 5
x.1 x.2 x.3 x.4 var
<dbl> <dbl> <dbl> <dbl> <dbl>
1 32.7 42.7 50.1 20.8 7091.
2 75.9 71.3 83.6 77.6 7091.
3 49.6 28.7 97.0 59.7 7091.
4 47.4 96.1 31.9 79.7 7091.
5 54.2 47.1 81.7 41.6 7091.
6 27.9 58.1 97.4 25.9 7091.
7 61.8 78.3 52.6 67.7 7091.
8 85.4 51.3 38.8 82.0 7091.
9 27.9 72.6 68.9 25.2 7091.
10 87.2 42.1 27.6 73.9 7091.
# ... with 20 more rows其中7091是一个不正确的和。
如何调整这一职能?
发布于 2019-04-30 19:34:51
这可以使用purrr::pmap完成,它将参数列表传递给接受“点”的函数。由于像mean、sd等大多数函数都使用向量,所以需要将调用与域提升器配对。
df_1 %>% select(-y) %>% mutate( var = pmap(., lift_vd(mean)) )
# x.1 x.2 x.3 x.4 var
# 1 70.12072 62.99024 54.00672 86.81358 68.48282
# 2 49.40462 47.00752 21.99248 78.87789 49.32063
df_1 %>% select(-y) %>% mutate( var = pmap(., lift_vd(sd)) )
# x.1 x.2 x.3 x.4 var
# 1 70.12072 62.99024 54.00672 86.81358 13.88555
# 2 49.40462 47.00752 21.99248 78.87789 23.27958函数sum直接接受点,因此不需要取消它的域:
df_1 %>% select(-y) %>% mutate( var = pmap(., sum) )
# x.1 x.2 x.3 x.4 var
# 1 70.12072 62.99024 54.00672 86.81358 273.9313
# 2 49.40462 47.00752 21.99248 78.87789 197.2825所有内容都符合标准的dplyr数据处理,因此可以将这三个参数作为单独的参数组合到mutate。
df_1 %>% select(-y) %>%
mutate( v1 = pmap(., lift_vd(mean)),
v2 = pmap(., lift_vd(sd)),
v3 = pmap(., sum) )
# x.1 x.2 x.3 x.4 v1 v2 v3
# 1 70.12072 62.99024 54.00672 86.81358 68.48282 13.88555 273.9313
# 2 49.40462 47.00752 21.99248 78.87789 49.32063 23.27958 197.2825发布于 2019-06-21 13:13:52
这是一个棘手的问题,因为dplyr在许多操作中按列操作。最初,我从基R中使用apply对行进行应用,但apply是处理字符和数字类型时出现问题。
相反,我们可以使用(老化的) plyr 和adply来简单地完成这一任务,因为plyr允许我们将一行数据帧作为向量对待:
df_1 %>% select(-y) %>% adply(1, function(df) c(v1 = sd(df[1, ])))注意,一些像var这样的函数不能在单行数据框架上工作,所以我们需要使用as.numeric将其转换为向量。
https://stackoverflow.com/questions/55922514
复制相似问题