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"
正如你所看到的,列名称1和2被X5和X6取代。
有人可以告诉我为什么发生这种情况,有没有一个正确的方法来做到这一点,而不会丢失列名?
猎枪解决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
注意:它弄乱了索引(最左边)。 我还没有想出如何防止(其他人?),但大部分时间可能无关紧要。