Как создать несколько кадров данных в цикле - PullRequest
0 голосов
/ 24 марта 2019

Я хочу создать несколько фреймов данных (df1, df2 и т. Д.) На основе одного большого фрейма данных (df0). Каждый новый фрейм данных должен состоять из некоторого набора столбцов из df0.

df0 <- data.frame(v0=c(0, 0), v1=c(3, 4), v2=c(5, 6), v3=c(7, 8))

for(i in 1:3) {
   secondcol <- colnames(df0[,..i])                  # I get an error here
   dfX = subset(df0, select = c("v0", secondcol))    # dfX should be df & i
}

# The for loop should replicate the following three comands:
df1 = subset(df0, select = c("v0", "v1"))
df2 = subset(df0, select = c("v0", "v2"))
df3 = subset(df0, select = c("v0", "v3"))

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Я бы рекомендовал использовать список, чтобы сохранить организованные кадры данных.Вот подход, использующий lapply().

i <- 1:3
setNames(lapply(i+1, function(j) df0[c(1, j)]), paste0("df", i))
# $df1
#   v0 v1
# 1  0  3
# 2  0  4
#
# $df2
#   v0 v2
# 1  0  5
# 2  0  6
#
# $df3
#   v0 v3
# 1  0  7
# 2  0  8
0 голосов
/ 24 марта 2019

Есть много способов сделать это. Чтобы ваш код работал, как показано ниже:

library(dplyr)
for(i in 1:3) {
  secondcol <- colnames(df0)[(i+1)]
  dat <- select(df0, c("v0", secondcol)) 
  assign(paste0("df", i), dat)
  rm(dat)
}

@ Богатое решение намного удобнее в управлении. Если вы по-прежнему хотите, чтобы они использовались в качестве сред данных в вашей среде, вы можете использовать:

i <- 1:3
list2env(setNames(lapply(i+1, function(j) df0[c(1, j)]), paste0("df", i)), envir = .GlobalEnv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...