使用dplyr对以字符串开头的列进行平均
假设我想使用dplyr对以字符串开头的所有列进行平均。我之所以使用平均值,不是因为我对这个平均值函数感兴趣,而是为了给出一个简单的例子,因为事实上,我更感兴趣的是使用更复杂的函数,它将未知数量的列作为输入。我尝试使用:使用dplyr对以字符串开头的列进行平均,r,dplyr,tidyverse,R,Dplyr,Tidyverse,假设我想使用dplyr对以字符串开头的所有列进行平均。我之所以使用平均值,不是因为我对这个平均值函数感兴趣,而是为了给出一个简单的例子,因为事实上,我更感兴趣的是使用更复杂的函数,它将未知数量的列作为输入。我尝试使用: iris %>% mutate_at(vars(starts_with("Sepal")), funs(size=mean)) 但最终在所有行上得到相同的数字。所以我试着: iris %>% rowwise() %>% mutate_at(vars(star
iris %>% mutate_at(vars(starts_with("Sepal")), funs(size=mean))
但最终在所有行上得到相同的数字。所以我试着:
iris %>% rowwise() %>% mutate_at(vars(starts_with("Sepal")), funs(size=mean))
但是平均值应用于每个条目,因此不是我想要的平均值。例如,对于iris数据集的第一行,我希望得到size=(5.1+3.5)/2
我该怎么办
更新:根据@Ronack的回答,我在下面编写了这行代码
codes <- c("J13","J14",paste0("J", c(seq(150,160))),"J170")
is_in_set <- function(x) {
return(any(x %in% codes))
}
bd_test <- bd %>%
mutate(is_pneumonia = pmap_lgl(select(., starts_with('f.41270.0')), ~is_in_set(c(...))))
这真的应该是
> bd %>% select(starts_with("f.41270.0"))%>% head(1)
f.41270.0.0 f.41270.0.1 f.41270.0.2 f.41270.0.3 f.41270.0.4 f.41270.0.5 f.41270.0.6 f.41270.0.7 f.41270.0.8 f.41270.0.9 f.41270.0.10
1 D467 D619 D696 D70 E831 G10 I10 M478 N189 N19 R931
f.41270.0.11 f.41270.0.12 f.41270.0.13 f.41270.0.14 f.41270.0.15 f.41270.0.16 f.41270.0.17 f.41270.0.18 f.41270.0.19 f.41270.0.20
1 Y848 Z513 Z538 Z539 <NA> <NA> <NA> <NA> <NA> <NA>
f.41270.0.21 f.41270.0.22 f.41270.0.23 f.41270.0.24 f.41270.0.25 f.41270.0.26 f.41270.0.27 f.41270.0.28 f.41270.0.29 f.41270.0.30
1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
>bd%>%select(以(“f.41270.0”)开头)%>%head(1)
f、 41270.0.0 f.41270.0.1 f.41270.0.2 f.41270.0.3 f.41270.0.4 f.41270.0.5 f.41270.0.6 f.41270.0.7 f.41270.0.8 f.41270.0.9 f.41270.0.10
1 D467 D619 D696 D70 E831 G10 I10 M478 N189 N19 R931
f、 41270.0.11 f.41270.0.12 f.41270.0.13 f.41270.0.14 f.41270.0.15 f.41270.0.16 f.41270.0.17 f.41270.0.18 f.41270.0.19 f.41270.0.20
1 Y848 Z513 Z538 Z539
f、 41270.0.21 f.41270.0.22 f.41270.0.23 f.41270.0.24 f.41270.0.25 f.41270.0.26 f.41270.0.27 f.41270.0.28 f.41270.0.29 f.41270.0.30
1.
这些字符串被转换为一些任意数字,因为的保持不变。如果您使数据集仅包含上述内容,您将得到相同的结果,因此这是一个可用于再现结果的数据集。您可以使用
rowMeans
:
iris$size <- rowMeans(iris[grep('^Sepal', names(iris))])
老实说,我真的不明白你的目的是什么,但也许是这个
iris %>%
mutate(size = rowMeans(select(., starts_with("Sepal")), na.rm = T)
就像我说的,我对均值函数不感兴趣。我想应用一个更一般的函数。我只是以均值为例。这里的c(…)是什么?那么我应该为任意函数做
~function\u name(c(…)
吗?是的,在第二个选项中,用你的函数名替换mean
。我明白了。那么你是说pmap是唯一一种可能没有更简单解决方案的方法?(例如,仅使用dplyr)我什么时候说过pmap
是唯一的方法?简单是上下文和主观的。还有其他方法,例如使用rowwise
或将数据转换为长格式并应用函数,但在不了解函数的更多细节的情况下,我很难提出其他替代方法。正如我所说,我对平均函数不感兴趣。我想应用一个更一般的函数。我只是以平均数为例。
library(dplyr)
library(purrr)
iris %>% mutate(size = pmap_dbl(select(., starts_with('Sepal')), ~mean(c(...))))
iris %>%
mutate(size = rowMeans(select(., starts_with("Sepal")), na.rm = T)