R: Изменить объекты внутри цикла - PullRequest
0 голосов
/ 25 мая 2018
a <- data.frame(x = c(1, 2))
b <- data.frame(x = c(3, 4))

for (df in list(a, b)) {
  print(df)
  df$y <- c(5, 6)
}

Каждый из фреймов данных распечатывается правильно, но при добавлении дополнительного столбца происходит сбой.
Обширный веб-поиск предложил что-то вроде

lapply(list(a, b), function(df){
  df$y <- c(5, 6)
})

, но это не помогло мне.

Меня также очень заинтересовало бы то, почему оператор print в цикле for работает, но добавление столбца y завершается неудачей.

Это меня удивляет.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018
> a <- data.frame(x = c(1, 2))
> b <- data.frame(x = c(3, 4))
> l <- list(a = a, b = b)
> list2env(lapply(l, function(x) {x$y <- c(5, 6);x}), envir = .GlobalEnv)
<environment: R_GlobalEnv>
> a
  x y
1 1 5
2 2 6
> b
  x y
1 3 5
2 4 6
0 голосов
/ 25 мая 2018

Вы должны вернуть df с этим дополнительным столбцом.Попробуйте:

lapply(list(a, b), function(df){
  df$y <- c(5, 6); return(df)
})

Вывод:

[[1]]
  x y
1 1 5
2 2 6

[[2]]
  x y
1 3 5
2 4 6

Поскольку @ dash2 предполагает, что вы можете захотеть назначить эти измененные df на list из df 's.Таким образом, полный код может выглядеть так:

a <- data.frame(x = c(1, 2))
b <- data.frame(x = c(3, 4))

l <- list(a, b)
l <- lapply(l, function(df){ df$y <- c(5, 6); return(df) })
...