Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr对以字符串开头的列进行平均_R_Dplyr_Tidyverse - Fatal编程技术网

使用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

假设我想使用dplyr对以字符串开头的所有列进行平均。我之所以使用平均值,不是因为我对这个平均值函数感兴趣,而是为了给出一个简单的例子,因为事实上,我更感兴趣的是使用更复杂的函数,它将未知数量的列作为输入。我尝试使用:

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)