Как сохранить несколько столбцов в R как CSV-файл? - PullRequest
2 голосов
/ 30 января 2020

У меня есть список фреймов данных «181», и я хочу извлечь 2-й столбец и сохранить его в CSV-файл и пометить его, метки для этих 181 DFS являются 0,1,2,3,4, 5,6. Проблема в том, что у меня разная длина для каждого df, и я не знаю, применимо ли это в R!

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Это неэффективное, но легко кодируемое решение (и эффективность не имеет значения, когда все, что вам нужно сделать, это вывести короткий CSV-файл). Каждый кадр данных записывается по одной строке за раз, при условии, что кадры данных представлены списком l.df.

#
# Prepare for output and input.
#
fn <- "temp.csv"
if(is.null(names(l.df))) names(l.df) <- 1:length(l.df)
#
# Loop over the data frames.
#
append <- FALSE
for (s in names(l.df)) {
  #
  # Create a one-row data frame for this column.
  #
  X <- data.frame(ID=s, as.list(l.df[[s]][[2]]))
  #
  # Append it to the output.
  #
  write.table(X, file=fn, sep=",", row.names=FALSE, col.names=FALSE, append=append)
  append <- TRUE
}

Например, мы можем подготовить набор кадров данных со случайными записями:

set.seed(17)
l.df <- lapply(1+rpois(181, 5), function(n) data.frame(X=1:n, Y=round(rnorm(n),2)))

Выходной файл выглядит так:

"1",0.37,1.61,0.02,0.51
"2",1.07,0.13,-0.55,0.34,2.24,0.41,0.26,0.13,-0.48,0.07,0.54
... (177 lines omitted)
"180",0.58,-1.5,1.85,-1.02
"181",-0.59,0.12,-0.38,-0.35,1.22,-0.63,0.81
0 голосов
/ 30 января 2020

Есть много способов решения ваших проблем, я просто предложу самый простой с основанием R, циклом ? (в противном случае работайте с tidyverse ).
Проблема разной длины df (в члены строк) могут быть решены путем добавления NA в конце.

Я предполагаю, что это ваша установка:

# Your list of data frames
yourlistofdataframes <- list()
for (i in 1:182) { # in R list indices run from 1 to 181 (in Python from 0 onwards)
  nrowofdf <- sample(1:100,1) # random number of rows between 1 and 100
  yourlistofdataframes[[i]] <- data.frame(cbind(rep(paste0("df",i,"|column1"),nrowofdf),
                                                rep(paste0("df",i,"|column2"),nrowofdf),
                                                rep(paste0("df",i,"|column3"),nrowofdf)))
}
names(yourlistofdataframes) <- 0:181 # labeling the data frames

Тогда это ваше решение:

newlist <- list()
for (i in 1:length(yourlistofdataframes)){
  newlist[[i]] <- unlist(yourlistofdataframes[[i]][2])
}
names(newlist) <- 0:181 # give them the names you wanted
newlist <- lapply(newlist, `length<-`, max(lengths(newlist))) # add NA's to make them equal length

# bind back to data.frame & save as csv
newdf <- data.frame(newlist) # if you want to have the data in 181 columns in your final df
newdft <- t(newdf) # if you want to have the data in 181 rows in your final df
write.csv(newdf, "mycsv.csv")

Отзыв на ваш вопрос :

  • Кроме того, если вы хотите попросить совета по кодированию, опубликуйте некоторое представление ваших данных, чтобы люди не не нужно предполагать, как ваши данные выглядят / строят свои собственные.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...