我读取了数据框,并将其存储在变量中。然后,我创建了一个空列表。我创建了一个循环,该循环遍历各列,并通过select()
函数创建数据框,并将其分配给列表中的下一个位置。但是,事实并非如此,只有列存储在列表中。
这是我的代码:
library(tidyverse)
data = read_csv('hubbard_data.csv')
columns = colnames(data)
#make date and time correct
data$TIMESTAMP_START = strptime(data$TIMESTAMP_START,"%Y%m%d%H%M")
data$TIMESTAMP_END = strptime(data$TIMESTAMP_END,"%Y%m%d%H%M")
dfs = list() #List of data frames
it = 1 #Iterator
while(it <= length(columns)){
dfs[it] <- data %>% select(columns[it],LE)
it = it + 1
}
我做了进一步的分析,发现了这一点:
temp1 <- data %>% select(columns[1],LE)
dfs[1] <- data %>% select(columns[1],LE)
temp1
是一个数据帧,但dfs[1]
不是。为什么?
您可以通过执行以下操作将数据帧分为单列数据帧列表:
my_list <- lapply(as.list(data), as.data.frame)
如果要将原始数据框中的LE
列添加到列表中的所有数据框中,则可以执行
my_list <- lapply(my_list, function(x) { x$LE <- data$LE; return(x) })
这是执行此操作的一种方法:
library(data.table)
dat <- as.data.table(mtcars)
mylist <- lapply(colnames(dat), function(z){
return_table <- dat[, .(get(z))]
names(return_table) <- z
return(return_table)
})
检查输出:
> str(mylist[[1]])
Classes ‘data.table’ and 'data.frame': 32 obs. of 1 variable:
$ mpg: num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
- attr(*, ".internal.selfref")=<externalptr>
> str(mylist[[5]])
Classes ‘data.table’ and 'data.frame': 32 obs. of 1 variable:
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
- attr(*, ".internal.selfref")=<externalptr>
如果要多于一列(例如,mpg
必须始终存在),则可以如下所示更改以下两行:
return_table <- dat[, .(mpg, get(z))]
names(return_table) <- c('mpg', z)
具有此更改的输出:
> str(mylist[[5]])
Classes ‘data.table’ and 'data.frame': 32 obs. of 2 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
- attr(*, ".internal.selfref")=<externalptr>