R:将行添加到空数据框时丢失列名称

我只是从R开始,遇到了一个奇怪的行为:当在一个空的数据框中插入第一行时,原来的列名会丢失。

例:

a<-data.frame(one = numeric(0), two = numeric(0)) a #[1] one two #<0 rows> (or 0-length row.names) names(a) #[1] "one" "two" a<-rbind(a, c(5,6)) a # X5 X6 #1 5 6 names(a) #[1] "X5" "X6" 

正如你所看到的,列名称12X5X6取代。

有人可以告诉我为什么发生这种情况,有没有一个正确的方法来做到这一点,而不会丢失列名?

猎枪解决scheme将保存在一个辅助向量中的名称,然后在dataframe上完成工作后将其添加回来。

谢谢

语境:

我创build了一个收集一些数据的函数,并将它们作为一个新行添加到作为参数接收的dataframe中。 我创build数据框,遍历数据源,将data.frame传递给每个函数调用以填充其结果。

rbind帮助页面指定:

对于'cbind'('rbind'),零长度的向量(包括'NULL')将被忽略,除非结果将有零行(列),为了S兼容性。 (零范围matrix不会出现在S3中,并且在R中不被忽略)

所以,实际上,在你的rbind指令中忽略了a 。 看起来并不完全忽略,因为它是一个数据框, rbind函数被称为rbind.data.frame

 rbind.data.frame(c(5,6)) # X5 X6 #1 5 6 

也许一种插入行的方法可能是:

 a[nrow(a)+1,] <- c(5,6) a # one two #1 5 6 

但是根据你的代码,可能有更好的方法来做到这一点。

解决方法是:

 a <- rbind(a, data.frame(one = 5, two = 6)) 

?rbind指出合并对象需要匹配的名称:

然后它从第一个数据框中获取列的类,并按名称匹配列(而不是按位置)

FWIW,另一种devise可能会让你的函数为两列创build向量,而不是绑定到数据框:

 ones <- c() twos <- c() 

修改你的函数中的向量:

 ones <- append(ones, 5) twos <- append(twos, 6) 

根据需要重复,然后一次创build您的data.frame:

 a <- data.frame(one=ones, two=twos) 

几乎投降了这个问题。

1)创build数据框与stringsAsFactor设置为FALSE或者直接运行到下一个问题

2)不要使用rbind – 不知道为什么在地球上搞乱了列名。 只需这样做:

df[nrow(df)+1,] <- c("d","gsgsgd",4)

 df <- data.frame(a = character(0), b=character(0), c=numeric(0)) df[nrow(df)+1,] <- c("d","gsgsgd",4) #Warnmeldungen: #1: In `[<-.factor`(`*tmp*`, iseq, value = "d") : # invalid factor level, NAs generated #2: In `[<-.factor`(`*tmp*`, iseq, value = "gsgsgd") : # invalid factor level, NAs generated df <- data.frame(a = character(0), b=character(0), c=numeric(0), stringsAsFactors=F) df[nrow(df)+1,] <- c("d","gsgsgd",4) df # abc #1 d gsgsgd 4 

你可以这样做:

给最初的数据框一行

  df=data.frame(matrix(nrow=1,ncol=length(newrow)) 

添加你的新行,拿出NAS

 newdf=na.omit(rbind(newrow,df)) 

但要小心,你的新生没有NA,否则也会被删除。

干杯阿古斯

下面是一种使其一般工作方式和重新input列名最less量的方法。 这种方法不需要黑客攻击NA或0。

 rs <- data.frame(i=numeric(), square=numeric(), cube=numeric()) for (i in 1:4) { calc <- c(i, i^2, i^3) # append calc to rs names(calc) <- names(rs) rs <- rbind(rs, as.list(calc)) } 

rs会有正确的名字

 > rs i square cube 1 1 1 1 2 2 4 8 3 3 9 27 4 4 16 64 > 

我使用以下解决scheme将一行添加到一个空的数据框:

 d_dataset <- data.frame( variable = character(), before = numeric(), after = numeric(), stringsAsFactors = FALSE) d_dataset <- rbind( d_dataset, data.frame( variable = "test", before = 9, after = 12, stringsAsFactors = FALSE)) print(d_dataset) variable before after 1 test 9 12 

HTH。

亲切的问候

乔治·

numeric(0)构造data.frame,而不是as.numeric(0)

 a<-data.frame(one=as.numeric(0), two=as.numeric(0)) 

这会创build一个额外的初始行

 a # one two #1 0 0 

绑定额外的行

 a<-rbind(a,c(5,6)) a # one two #1 0 0 #2 5 6 

然后使用负面索引删除第一(假)行

 a<-a[-1,] a # one two #2 5 6 

注意:它弄乱了索引(最左边)。 我还没有想出如何防止(其他人?),但大部分时间可能无关紧要。