我正在尝试从数据集的多个子集中收集一些数据,并且需要创建一个数据框来收集结果。我的问题是不知道如何创建一个具有已定义列数的空数据框而不实际放入数据。
collect1 <- c() ## i'd like to create empty df w/ 3 columns: `id`, `max1` and `min1`
for(i in 1:10){
collect1$id <- i
ss1 <- subset(df1, df1$id == i)
collect1$max1 <- max(ss1$value)
collect1$min1 <- min(ss1$value)
}
我觉得这个问题非常愚蠢(我几乎觉得我之前已经问过它但是找不到它)但是非常感谢任何帮助。
答案 0 :(得分:103)
NA
的数据框是否有效?
类似的东西:
data.frame(matrix(NA, nrow = 2, ncol = 3))
如果您需要更具体地了解数据类型,则可能更喜欢:NA_integer_
,NA_real_
,NA_complex_
或NA_character_
,而不仅仅是NA
这是合乎逻辑的
NAs
可能更具体的其他内容:
data.frame(matrix(vector(mode = 'numeric',length = 6), nrow = 2, ncol = 3))
其中模式可以是任何类型。见?vector
答案 1 :(得分:23)
只需创建一个空矢量数据框:
collect1 <- data.frame(id = character(0), max1 = numeric(0), max2 = numeric(0))
但是如果你知道你预先要有多少行,那么你应该创建一个包含许多行的数据框。
答案 2 :(得分:11)
您可以执行以下操作:
N <- 10
collect1 <- data.frame(id = integer(N),
max1 = numeric(N),
min1 = numeric(N))
现在要小心,在其余代码中,您忘记使用行索引逐行填充data.frame。它应该是:
for(i in seq_len(N)){
collect1$id[i] <- i
ss1 <- subset(df1, df1$id == i)
collect1$max1[i] <- max(ss1$value)
collect1$min1[i] <- min(ss1$value)
}
最后,我会说有很多选择可以做你想要完成的事情,有些会更有效率并且使用更少的打字。例如,您可以查看aggregate
函数或ddply
包中的plyr
。
答案 3 :(得分:8)
您可以使用NULL
代替NA
。这会创建一个真正空的数据框。
答案 4 :(得分:5)
df = data.frame(matrix("", ncol = 3, nrow = 10)
答案 5 :(得分:3)
如果您想要一个具有已定义行数和无列的空数据框,请使用此解决方案:
df = data.frame(matrix(NA, ncol=1, nrow=10)[-1]
答案 6 :(得分:2)
这可能有助于另一个论坛提供的解决方案, 基本上是: 即。
Cols <- paste("A", 1:5, sep="")
DF <- read.table(textConnection(""), col.names = Cols,colClasses = "character")
> str(DF)
'data.frame': 0 obs. of 5 variables:
$ A1: chr
$ A2: chr
$ A3: chr
$ A4: chr
$ A5: chr
您可以更改colClasses以满足您的需求。
原始链接是 https://stat.ethz.ch/pipermail/r-help/2008-August/169966.html
答案 7 :(得分:1)
创建任意大小数据框的更通用方法是从相同维度的矩阵创建n×1数据帧。然后,您可以立即删除第一行:
> v <- data.frame(matrix(NA, nrow=1, ncol=10))
> v <- v[-1, , drop=FALSE]
> v
[1] X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
<0 rows> (or 0-length row.names)
答案 8 :(得分:1)
如果只有列名可用,如:
cnms <- c("Nam1","Nam2","Nam3")
要使用上述变量名创建空数据框,请先创建一个data.frame
对象:
emptydf <- data.frame()
现在调用每列的第0个元素,从而创建一个具有给定变量名称的空数据框:
for( i in 1:length(cnms)){
emptydf[0,eval(cnms[i])]
}
答案 9 :(得分:0)
seq_along
可能有助于找出数据文件中的行数并创建具有所需行数的data.frame
listdf <- data.frame(ID=seq_along(df),
var1=seq_along(df), var2=seq_along(df))
答案 10 :(得分:0)
我遇到了同样的问题,并且有一个更干净的解决方案。您可以将数据另存为命名列表,而不必创建一个空的data.frame
。将所有结果添加到此列表后,您可以将其转换为data.frame。
对于一次添加一个功能,效果最好。
mylist = list()
for(column in 1:10) mylist$column = rnorm(10)
mydf = data.frame(mylist)
对于一次添加一行的情况,由于混合类型,这变得很棘手。如果所有类型都相同,那很容易。
mylist = list()
for(row in 1:10) mylist$row = rnorm(10)
mydf = data.frame(do.call(rbind, mylist))
我还没有找到添加混合类型行的简单方法。在这种情况下,如果必须这样做,则空的data.frame可能是最佳解决方案。