Добавление столбцов во фреймы данных с помощью цикла for

На варианты этого вопроса были даны ответы, но я изо всех сил пытаюсь применить их к моему набору данных как кто-то относительно неопытный в R / программировании. У меня есть несколько фреймов данных, и я пытаюсь использовать цикл for для создания новой переменной, добавляемой в каждый из фреймов данных.

Каждый фрейм данных имеет одни и те же имена столбцов, но фреймы данных представляют разные моменты времени (например, w1 - волна 1, w2 - волна 2 и т. Д.).

Я выполнил цикл for: 1) отменил оценку нескольких элементов, затем 2) вычислил новую переменную, которая представляет собой просто сумму нескольких переменных.

w1
cesd1   cesd2
0       0
1       1
2       1 


w2
cesd1   cesd2
3       0
1       2
2       1 

waves = list(w1, w2)

for(i in 1:length(waves)) {
waves[[i]]$cesd2R <- abs(waves[[i]]$cesd2 - 3)

waves[[i]]$cesdTot <- with(waves[[i]], cesd1+ cesd2R, na.rm = T)
}

Я хотел бы получить вывод, который включает все предыдущие столбцы в каждом фрейме данных ПЛЮС новые столбцы, которые я вычисляю в цикле («cesd2R» и «cesdTot») в каждом из фреймов данных.

w1
cesd1   cesd2  cesd2R cesdTot
0       0       3     3 
1       1       2     3



w2
cesd1   cesd2 cesd2R cesdTot
3       0     3      6
1       2     1      2 

Когда я запускаю цикл, я не получаю ошибок, но вроде ничего не происходит. Что мне не хватает? Большое спасибо!


person Hunter    schedule 16.05.2019    source источник
comment
Когда я запускаю ваш код, data.frames в waves кажутся вашим желаемым результатом, поэтому я не могу воспроизвести вашу проблему. Вы, может быть, не заметили переназначения результатов в списке waves обратно на w1 и w2?   -  person teunbrand    schedule 16.05.2019
comment
Да, это был последний шаг, которого мне не хватало - я не назначал волны обратно на w1 и w2, поэтому решил его, выполнив: w1 = waves [[1]]. Спасибо!   -  person Hunter    schedule 16.05.2019


Ответы (3)


Похоже, вы ошиблись при создании второго объекта в цикле. Вместо cesd2R вы набираете cesdR2. Это исправит?

> for(i in 1:length(waves)) {
+   waves[[i]]$cesd2R <- abs(waves[[i]]$cesd2 - 3)
+   waves[[i]]$cesdTot <- with(waves[[i]], cesd1+ cesd2R, na.rm = T)
+ }
> waves
[[1]]
  cesd1 cesd2 cesd2R cesdTot
1     0     0      3       3
2     1     1      2       3
3     2     1      2       4

[[2]]
  cesd1 cesd2 cesd2R cesdTot
1     3     0      3       6
2     1     2      1       2
3     2     1      2       4
person ljh2001    schedule 16.05.2019

(а) будьте осторожны с именами, ваш код использует cesdR2 в одном месте, но ваш текст и образцы данных используют cesd2R.

(b) Вы указываете na.rm = TRUE в качестве аргумента для with(), что не сработает должным образом. + также не имеет места для na.rm аргумента, так что это один из способов:

for(i in 1:length(waves)) {
  waves[[i]]$cesd2R <- abs(waves[[i]]$cesd2 - 3)
  waves[[i]]$cesdTot <- rowSums(waves[[i]][, c("cesd1", "cesd2R")], na.rm = TRUE)
}

потому что rowSums действительно принимает аргумент na.rm.

person Gregor Thomas    schedule 16.05.2019

Я получил некоторую помощь от коллеги и решил мою проблему, в которой просто отсутствовал шаг по назначению «волн» обратно каждому исходному фрейму данных.

Итак, исходный код работает:

w1
cesd1   cesd2
0       0
1       1
2       1 


w2
cesd1   cesd2
3       0
1       2
2       1 

waves = list(w1, w2)

for(i in 1:length(waves)) {
waves[[i]]$cesd2R <- abs(waves[[i]]$cesd2 - 3)

waves[[i]]$cesdTot <- with(waves[[i]], cesd1+ cesd2R, na.rm = T)
}

и я добавил:

w1 = waves[[1]]
w2 = waves[[2]]
person Hunter    schedule 16.05.2019