R变异列表示许多其他列的平均值

时间:2018-05-22 21:25:24

标签: r dplyr tidyverse

我正在尝试在我的DataFrame中添加一个列,表示许多其他列的平均值(表示单个构造的项目)。

数据框有很多其他列,但特别是列eng1,eng2,eng3 ... engN,其中N是一个大数字,我想取所有eng *列的平均值,并将该均值添加到我的新列中数据集。

我能够使用以下代码执行此操作:

narrow_ds # ... initialization of dataframe
library(dplyr)
narrow_ds <- bind_cols(narrow_ds, (narrow_ds %>% 
select(starts_with("eng")) %>% mutate(eng=rowMeans(., na.rm=TRUE))) %>% 
select(eng))

似乎有na.rm = TRUE要求迫使我跳过一些箍。

我的问题是,是否有更简单的方法可以做到这一点?

5 个答案:

答案 0 :(得分:4)

从基础R中的@MKR窃取样本数据:

DF$eng <- rowMeans(DF[startsWith(names(DF),"eng")], na.rm = TRUE)

# # A tibble: 4 x 5
#      id  eng1  eng2  eng3      eng
#   <int> <dbl> <dbl> <dbl>    <dbl>
# 1     1    50    NA    20 35.00000
# 2     2    NA   100    10 55.00000
# 3     3    20   150    80 83.33333
# 4     4    30   200    40 90.00000

答案 1 :(得分:3)

你正朝着正确的方向前进。您可以通过代码中的调整来避免bind_cols。此外,即使在NA中也支持rowMeans。我修改了@Tung使用的示例数据,以包含少量NAs。解决方案可以是:

选项#1:以与OP类似的方式使用dplyr

library(dplyr)
DF %>% mutate(eng = rowMeans(select(.,starts_with("eng")), na.rm = TRUE))

# # A tibble: 4 x 5
#      id  eng1  eng2  eng3   eng
#   <int> <dbl> <dbl> <dbl> <dbl>
# 1     1  50.0    NA  20.0  35.0
# 2     2  NA     100  10.0  55.0
# 3     3  20.0   150  80.0  83.3
# 4     4  30.0   200  40.0  90.0

选项#2:使用apply

DF$eng <- apply(DF[,grep("eng",names(DF))], 1, mean, na.rm = TRUE)

DF
# # A tibble: 4 x 5
#      id  eng1  eng2  eng3   eng
#    <int> <dbl> <dbl> <dbl> <dbl>
# 1     1  50.0    NA  20.0  35.0
# 2     2  NA     100  10.0  55.0
# 3     3  20.0   150  80.0  83.3
# 4     4  30.0   200  40.0  90.0

示例数据:

DF = data_frame(id = 1:4,
                eng1 = c(50, NA, 20, 30), 
                eng2 = c(NA, 100, 150, 200), 
                eng3 = c(20, 10, 80, 40))

答案 2 :(得分:2)

在遇到同样的问题后,我认为最简单的方法(平均值,标准差,总和等)通过使用“ dplyr”中的“ rowwise()”命令和将目标列与“ c”组合在一起()”内的通缉操作:

log_statement

还可以通过以下操作确保此操作在单个数据帧上结束:

idle_in_transaction_session_timeout

答案 3 :(得分:1)

# Example data
set.seed(1)
dtf <- as.data.frame(matrix(sample(1:10000), ncol=1000))
nam <- replicate(ncol(dtf), paste(sample(LETTERS, 10, replace=TRUE), collapse=""))
colnames(dtf) <- nam

我没有将列命名为“eng *”,但这在功能上是相同的 只会对名称以A开头的列进行平均。

eng <- rowMeans(dtf[, grep("^A", colnames(dtf))], na.rm=TRUE)
dtf <- cbind(eng, dtf)

summary(dtf)[,1:4]
# #      eng         BRTCBDWVWA     COCSSUQNLA     FIOULRNUXL  
# Min.   :4535   Min.   : 618   Min.   :1764   Min.   : 134  
# 1st Qu.:4780   1st Qu.:2922   1st Qu.:3805   1st Qu.:2254  
# Median :5187   Median :6008   Median :5916   Median :3604  
# Mean   :5107   Mean   :5513   Mean   :5580   Mean   :4174  
# 3rd Qu.:5337   3rd Qu.:8386   3rd Qu.:7557   3rd Qu.:5840  
# Max.   :5739   Max.   :9442   Max.   :9903   Max.   :9329  

答案 4 :(得分:1)

您可以使用pmap_dbl遍历数据框的每一行。这是一个带有一些随机数据的例子

library(tidyverse)

DF = data_frame(eng1 = c(50, 40, 20, 30), 
                eng2 = c(130, 100, 150, 200), 
                eng3 = c(20, 10, 80, 40))
DF

#> # A tibble: 4 x 3
#>    eng1  eng2  eng3
#>   <dbl> <dbl> <dbl>
#> 1    50   130    20
#> 2    40   100    10
#> 3    20   150    80
#> 4    30   200    40

DF %>% 
  select(starts_with("eng")) %>% 
  mutate(eng = pmap_dbl(., sum))

#> # A tibble: 4 x 4
#>    eng1  eng2  eng3   eng
#>   <dbl> <dbl> <dbl> <dbl>
#> 1    50   130    20   200
#> 2    40   100    10   150
#> 3    20   150    80   250
#> 4    30   200    40   270

# or define a function
sumAll <- function(...) {
  x = c(...)
  sum(x, na.rm = TRUE)
}

DF %>% 
  select(starts_with("eng")) %>% 
  mutate(eng = pmap_dbl(., sumAll))

#> # A tibble: 4 x 4
#>    eng1  eng2  eng3   eng
#>   <dbl> <dbl> <dbl> <dbl>
#> 1    50   130    20   200
#> 2    40   100    10   150
#> 3    20   150    80   250
#> 4    30   200    40   270

reprex package(v0.2.0)创建于2018-05-22。