R:在向空数据帧添加行时丢失列名

cdm*_*hai 62 r names dataframe rbind

我刚刚开始使用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"
Run Code Online (Sandbox Code Playgroud)

如您所见,列名12X5X6替换.

有人可以告诉我为什么会这样,并且有没有正确的方法来做到这一点而不会丢失列名?

霰弹枪解决方案是将名称保存在辅助矢量中,然后在完成数据帧处理后将其添加回来.

谢谢

语境:

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

jub*_*uba 34

rbind帮助页面规定:

对于'cbind'('rbind'),除非结果为零行(列),否则忽略零长度(包括'NULL')的向量,以实现S兼容性.(零范围矩阵不会出现在S3中,并且在R中不会被忽略)

事实上,a在你的rbind指令中被忽略了.似乎并没有完全忽略,因为它是一个数据框,该rbind函数被称为rbind.data.frame:

rbind.data.frame(c(5,6))
#  X5 X6
#1  5  6
Run Code Online (Sandbox Code Playgroud)

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

a[nrow(a)+1,] <- c(5,6)
a
#  one two
#1   5   6
Run Code Online (Sandbox Code Playgroud)

但根据您的代码,可能有更好的方法.

  • 如果您有不同的数据类型(例如“字符”和“数字”),最好使用“列表”函数“列表(“五”,6)”。或者它会把一切都理解为性格。 (3认同)

Raf*_*ael 12

几乎屈服于这个问题.

1)创建数据框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
#  a      b c
#1 d gsgsgd 4
Run Code Online (Sandbox Code Playgroud)


Rom*_*rik 8

解决方法是:

a <- rbind(a, data.frame(one = 5, two = 6))
Run Code Online (Sandbox Code Playgroud)

?rbind 声明合并对象需要匹配名称:

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


Dav*_*vid 7

FWIW,一种替代设计可能会让您的函数为两列构建向量,而不是重新绑定到数据框:

ones <- c()
twos <- c()
Run Code Online (Sandbox Code Playgroud)

修改函数中的向量:

ones <- append(ones, 5)
twos <- append(twos, 6)
Run Code Online (Sandbox Code Playgroud)

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

a <- data.frame(one=ones, two=twos)
Run Code Online (Sandbox Code Playgroud)