我正在尝试在我的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要求迫使我跳过一些箍。
我的问题是,是否有更简单的方法可以做到这一点?
答案 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。