Как мне прокрутить имена столбцов для вычисления статистики? - PullRequest
1 голос
/ 23 марта 2019

говорят, что у меня есть данные, которые выглядят следующим образом

rating  repair  model
5        0       1
4        0       0 
2        1       1
5        1       0 

Я хочу, чтобы можно было найти среднее значение рейтинга при каждом ремонте == 1. Однако на самом деле у меня есть 200 имен столбцов, которые я хочу сделать, потому что они не соответствуют определенному шаблону. Я не знаю, как пройти через эти столбцы. Я знаю, что

 mean(dt[dt$repair==1,]$rating, na.rm=T)

получит мне то, что я хочу, но не как пройтись по кругу. Следующее не похоже на работу. Спасибо!

for(name in rep_names){
    dt[paste0('dt$',name)==1,]$rating
}

Ответы [ 3 ]

1 голос
/ 23 марта 2019

С data.table мы можем сделать

library(data.table)
setDT(df1)[repair == 1, lapply(.SD, mean, na.rm = TRUE)]
#   rating repair model
#1:    3.5      1   0.5

Обновление

На основании комментариев

setDT(df1)[column1 == 1 & column2 == 1, lapply(.SD, mean), .SDcols = 3:ncol(df1)]
1 голос
/ 23 марта 2019

Решение apply. Может быть медленным:

apply(df[df["repair"]==1,],2,mean)
# rating repair  model 
#   3.5    1.0    0.5 
1 голос
/ 23 марта 2019

Если вы хотите найти mean для всех столбцов, когда repair == 1, мы можем использовать summarize_all из dplyr

library(dplyr)

dt %>%
 filter(repair == 1) %>%
 summarize_all(~mean(., na.rm = TRUE))

# rating repair model
#1    3.5      1   0.5

В базе R мы также можем использовать colMeans

colMeans(dt[dt$repair == 1,], na.rm = TRUE)

#rating repair  model 
#   3.5    1.0    0.5 

EDIT

Как упоминалось в комментариях, если есть количество столбцов, которые нам нужно отфильтровать для 1, а затем взять среднее значение, мы можем сначала выбрать эти столбцы, используя индекс столбца или имя столбца. Например, давайте предположим, что мы хотим отфильтровать столбцы 2–3 здесь, тогда мы можем сделать

rep_names <- 2:3
colMeans(df[rowSums(df[rep_names] == 1) == length(rep_names), ])

#rating repair  model 
# 2      1      1 

rep_names может содержать номер столбца с именами столбцов, которые мы хотим проверить на 1.

...