Добавить столбцы во фреймы данных с помощью цикла for - PullRequest
1 голос
/ 16 мая 2019

На вариации этого вопроса ответили, но я изо всех сил пытаюсь применить их к моему набору данных как кто-то относительно неопытный в 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 

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

Ответы [ 3 ]

0 голосов
/ 16 мая 2019

(a) будьте осторожны с именами, ваш код использует 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.

0 голосов
/ 16 мая 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]]
0 голосов
/ 16 мая 2019

Похоже, что вы ошиблись при создании второго объекта в цикле.Вместо 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
...