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)
如您所见,列名1和2被X5和X6替换.
有人可以告诉我为什么会这样,并且有没有正确的方法来做到这一点而不会丢失列名?
霰弹枪解决方案是将名称保存在辅助矢量中,然后在完成数据帧处理后将其添加回来.
谢谢
语境:
我创建了一个函数,它收集一些数据并将它们作为新行添加到作为参数接收的数据帧中.我创建数据框,遍历我的数据源,将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)
但根据您的代码,可能有更好的方法.
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)
解决方法是:
a <- rbind(a, data.frame(one = 5, two = 6))
Run Code Online (Sandbox Code Playgroud)
?rbind 声明合并对象需要匹配名称:
然后它从第一个数据框中获取列的类,并按名称(而不是按位置)匹配列
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)
| 归档时间: |
|
| 查看次数: |
30880 次 |
| 最近记录: |