R: Как изменить значение ячейки информационного кадра, созданного с помощью переменной в цикле for - PullRequest
0 голосов
/ 09 октября 2019

Мне нужно обновить значение ячейки фрейма данных, созданного с помощью переменной в цикле for

Создать Dafaframe

df <- data.frame(
  col1 = c(rep(1,9)),
  col2 = c(rep(2,9)),
  col3= c(rep(3, 9))
)
df
  col1 col2 col3
1    1    2    3
2    1    2    3
3    1    2    3
4    1    2    3
5    1    2    3
6    1    2    3
7    1    2    3
8    1    2    3
9    1    2    3

Разделить на3 кадра данных, т.е. df1, df2, df3 Фактический набор данных является более сложным, однако цель состоит в том, чтобы обновить разделенные кадры данных, т.е. df1-3 в цикле for. Это потому, что мой набор данных очень большой.

Я попробовал закомментированную строку кода, но он дал мне новую переменную с соответствующим именем в функции вставки, присвоив ей значение 0

for(i in seq(1,3,1)){
  if (i == 1) {
  assign(paste0("df",i),df[1:3,])
  #assign(paste0("df",i,"$col2[1]"),0)
  }
  if (i == 2 ){
  assign(paste0("df",i),df[4:6,])
  #assign(paste0("df",i,"$col2[1]"),0)
  }
  if (i == 3 ){
  assign(paste0("df",i),df[7:9,])
  #assign(paste0("df",i,"$col2[1]"),0)
  } 
}

df1
  col1 col2 col3
1    1    2    3
2    1    2    3
3    1    2    3

Ожидаемый вывод Мне нужно использовать цикл for, чтобы обновить первую строку в столбце col2 каждого из разделенных фреймов данных до 0.

df1
  col1 col2 col3
1    1    0    3
2    1    2    3
3    1    2    3
Same for df2 and df3

1 Ответ

0 голосов
/ 09 октября 2019

Могу ли я предложить альтернативный подход? Вместо создания нескольких разных data.frames создайте список data.frames (используя split). Затем вы можете использовать lapply для внесения одинаковых изменений в каждый из элементов данных:

lapply(split(df,paste0("df",rep(1:3,each=3))),function(x) {x[1,2]<-0;x})

$df1
  col1 col2 col3
1    1    0    3
2    1    2    3
3    1    2    3

$df2
  col1 col2 col3
4    1    0    3
5    1    2    3
6    1    2    3

$df3
  col1 col2 col3
7    1    0    3
8    1    2    3
9    1    2    3

Если по какой-либо причине вы абсолютно настаиваете начать с цикла for для создания кадров данных (против которого я серьезно советую), вы можете затем поместить их все в список, используя lapply(paste0("df",1:3),get), и обернуть его в lapply, который я предложил выше, чтобы получить тот же результат (но без полезных имен элементов каждого из фреймов данныхв списке).

...