【发布时间】:2013-01-03 02:35:10
【问题描述】:
我正在尝试从它们的 data.frame 结构中剥离两个数据帧,提取每个 data.frame 中的元素,并将从数据帧中提取的数据组合成一个 data.frame。这应该会产生一个由两列作为向量组成的 data.frame。请参阅下面的输出(以粗体标记)。
问题:输出包含多个 data.frame 元素,而不是包含来自输入数据帧的向量的单个 data.frame。
每个数据帧包含一个向量。
[EDIT^v 响应 cmets.]
到目前为止,我已经尝试了as() 和unlist() 的各种组合,但无济于事......
我正在尝试使用内置的 R 函数和矢量化来解决这个问题(不使用plyr和loops:Merge several data.frames into one data.frame with a loop、Merge many data frames from csv files、Recombining a list of Data.frames into a single data frame)
可重现的代码:我无法重现错误,但这是我希望我的代码能够工作的方式:
df1<-data.frame<-c(1, 2, 3)
df2<-data.frame<-c(2, 4, 6)
output<-cbind(df1, df2)
print(output) #Returns a data.frame
str(output) # of vectors
#In my case however, a data.frame returns data.frames)
这会返回:
df1 df2
[1,] 1 2
[2,] 2 4
[3,] 3 6
现实:
readmultiple <- function(directory = "bigdata") {
....
....
....
output <- cbind.data.frame(filename, readmultiplesum)
# This is probably where things go wrong
return(output)
}
output <- lapply(filenames, complete.cases.sum)
assign("Global.output", output, envir = .GlobalEnv)
# There is probably a better way to do this too
if (firstoutput == 1) {
Global.output <- merge(as(unlist(Global.output[1]), "vector"),
as(unlist(output[1])), "vector")
# as, unlist... Not sure what's needed here
} else {
firstoutput <- 1
}
str(output)
return(Global.output)
}
输出看起来像
[[1]]
filename result
1 142
[[2]]
filename result
1 521
[[3]]
filename result
1 324
但我希望是这样的
filename result
[1,] filename[i] 142
[2,] filename[i] 521
[3,] filename[i] 324
...其中 filename[i] 是文件名的索引。
str(输出) 返回
List of 2400
$ :'data.frame': 1 obs. of 2 variables:
..$ filename : Factor w/ 1 level "bigdata/001.csv": 1
..$ sumrows: num 142
$ :'data.frame': 1 obs. of 2 variables:
..$ filename : Factor w/ 1 level "bigdata/001.csv": 1
..$ sumrows: num 521
$ :'data.frame': 1 obs. of 2 variables:
..$ filename : Factor w/ 1 level "bigdata/001.csv": 1
..$ sumrows: num 324
$ :'data.frame': 1 obs. of 2 variables:
..$ filename : Factor w/ 1 level "bigdata/001.csv": 1
.....
dput(head(output)) 返回
list(structure(list(filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"),
sumrows = 142), .Names = c("filename", "sumrows"), row.names = c(NA,
-1L), class = "data.frame"), structure(list(filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"),
sumrows = 521), .Names = c("filename", "sumrows"
), row.names = c(NA, -1L), class = "data.frame"), structure(list(
filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"),
sumrows = 324), .Names = c("filename", "sumrows"), row.names = c(NA,
-1L), class = "data.frame"), structure(list(filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"),
sumrows = 1896), .Names = c("filename", "sumrows"
), row.names = c(NA, -1L), class = "data.frame"), structure(list(
filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"),
sumrows = 1608), .Names = c("filename", "sumrows"
), row.names = c(NA, -1L), class = "data.frame"), structure(list(
filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"),
sumrows = 912), .Names = c("filename", "sumrows"), row.names = c(NA,
-1L), class = "data.frame"))
【问题讨论】:
-
为了节省人们的时间,您能否编辑您的问题并在顶部解释您所说的尝试添加两个数据框时是什么意思。我假设您不是在谈论
df1 + df2...事实上,您为什么不给我们一个可重复的示例,其中包含两个小的 data.frames 和您的预期输出?您的很多代码似乎与问题无关。 -
我现在试图澄清我的问题。
-
@DanielLabbé 什么是文件名[]?我的意思是为什么 []
-
请输入您的代码reproducible。我们应该能够将您的代码复制到 R 会话中以执行它。你的问题的答案可能会涉及到
?do.call。 -
@agstudy。抱歉,我的意思是 filename[i] 其中 i 是矢量文件名的索引。