2015-03-10 4 views
1

У меня есть набор данных со столбцами, которые следуют за определенным шаблоном префиксов и суффиксов и хотят систематически создавать столбцы.
Чтобы создать 6 день в среднем по NO2Значения столбцов для нескольких столбцов

df$no26 <- rowMeans(subset(df, select = c(no2_1,no2_2,no2_3,no2_4,no2_5,no2_6))) 

и 5 дней в среднем для Ьс будет создан с:

df$bc5<- rowMeans(subset(df, select = c(bc_1,bc_2,bc_3,bc_4,bc_5))) 

Как я мог бы создать такие средства с минимальным перечнем имен столбцов? Я также хочу вычислить средства, даже если отсутствуют значения. В таких случаях среднее значение должно вычисляться из всех значений столбца 8, доступных и отсутствующих).
В качестве примера я хотел бы создать столбец среднего 7.287 с кодом

df$no22 <- rowMeans(subset(df, select = c(no2_1,no2_2))) 

Но я получаю отсутствую вместо этого. Добавление na.rm = TRUE, похоже, не имеет эффекта.

выборки данных я нашел ниже:

structure(list(no2_1 = c(16.6652581627745, 16.1861644525723, 
12.0690739274929, 14.7180965643026, 17.0917121137918, 9.13346007146945, 
14.5734824353949), no2_2 = c(16.5288772204419, 16.0538191129928, 
11.9615084628895, 14.5947277746085, 16.9509944066106, 9.04001830385535, 
NA), no2_3 = c(16.7950934018671, 16.3337465438763, 12.1697391489627, 
14.8892362872197, 14.6354992469195, 8.92549980722639, 14.595366058328 
), no2_4 = c(17.180616290241, NA, 12.4976906878301, 15.2619924671276, 
12.4835154089113, 8.89727506636159, 14.9408652734481), no2_5 = c(16.8357574234312, 
17.8386592438754, 11.3983088719465, 16.3757398377023, 11.4093199571179, 
9.36056025673027, 15.9028268348344), no2_6 = c(16.0214862720291, 
18.4874694107089, 9.94904389869883, 16.9503452184647, 10.6770163895427, 
9.65783799344018, 15.7615475031484), bc_1 = c(0.161419291393667, 
0.157404540766928, 0.119038472594565, 0.139332980835602, 0.175313638583185, 
0.735663, 0.138659316642584), bc_2 = c(0.160963807995045, 
0.157468620067253, 0.119120320534171, 0.139882059272507, 0.175244058289416, 
0.0861284650489299, 0.13753649659359), bc_3 = c(0.165788721732669, 
0.162514084226369, 0.122749085709411, 0.144733227083797, 0.150886680287291, 
0.0859213694114626, 0.141372495609981), bc_4 = c(0.171603901048619, 
0.168286633890308, 0.127157156073102, 0.149955134061204, 0.127387599697608, 
0.0860720897547322, 0.146162920829911), bc_5 = c(0.168576332423096, 
0.183374076735581, 0.115963927265647, 0.164065282343513, 0.115121581746043, 
0.0911897631407383, 0.15828816660167), bc_6 = c(0.159774834761217, 
0.191737039861085, 0.100835120476982, 0.171016659707833, 0.106690061348893, 
0.0942738140677443, 0.157806261068888)), datalabel = "", time.stamp = "10 Mar 2015 21:51", .Names = c("no2_1", 
"no2_2", "no2_3", "no2_4", "no2_5", "no2_6", "bc_1", "bc_2", 
"bc_3", "bc_4", "bc_5", "bc_6"), formats = c("%9.0g", "%9.0g", 
"%9.0g", "%9.0g", "%9.0g", "%9.0g", "%9.0g", "%9.0g", "%9.0g", 
"%9.0g", "%9.0g", "%9.0g"), types = c(255L, 255L, 255L, 255L, 
255L, 255L, 255L, 255L, 255L, 255L, 255L, 255L), val.labels = c("", 
"", "", "", "", "", "", "", "", "", "", ""), var.labels = c("no2_1", 
"no2_2", "no2_3", "no2_4", "no2_5", "no2_6", "sot_1", "sot_2", 
"sot_3", "sot_4", "sot_5", "sot_6"), expansion.fields = list(
    c("_dta", "_lang_c", "default"), c("_dta", "_lang_list", 
    "default")), row.names = c("1", "2", "3", "4", "5", "6", 
"7"), version = 12L, class = "data.frame") 

ответ

0

Для двух ваших вопросов, вы можете сохранить ключевые штрихи с помощью paste или grepl, такие как

rowMeans(df[grepl("^no2", names(df))]) 

Или

rowMeans(df[paste0("no2_", 1:6)]) 

Or

rowMeans(df[paste0("bc_", 1:5)]) 

За последний вопрос, используйте rowSums вместо, и разделить на количество столбцов

temp <- df[c("no2_1","no2_2")] 
rowSums(temp, na.rm = TRUE)/ncol(temp) 
#   1   2   3   4   5   6   7 
# 16.597068 16.119992 12.015291 14.656412 17.021353 9.086739 7.286741 
+0

Давид, спасибо за код. Мне нравится решение для пасты. Для решения второго вопроса требуется больше ключевых штрихов, если вы хотите сказать, что 14-дневный средний. Таким образом, я изменил его с помощью этого параметра: temp <- df [, c (1: 2)] в течение двух дней и temp <- df [, c (1: 6)] для среднего значения за 6 дней. – Meso

+0

Да, я только дал это как решение вашего примера, вы можете использовать 'paste' тоже, чтобы создать' temp', он все равно будет работать одинаково. –

Смежные вопросы