我有以下内容来创建数据框。我的问题是数据框行名称显示为[1,],[2,],[3,],[4,]等,而不仅仅是1,2,3,4等(见下面的输出) 。为什么以及如何解决这个问题,让我的行名显示为常用(递增数字)。
Code:
df <- data.frame(id=c("id"),nobs=c("nobs"))
df <- cbind(id,nobs)
df
id和nobs是两个向量,每个向量有5个数值......
Current output:
id nobs
[1,] 2 3653
[2,] 4 3653
[3,] 8 1462
[4,] 10 1097
[5,] 12 732
Desired output:
id nobs
1 2 3653
2 4 3653
3 8 1462
4 10 1097
5 12 732
答案 0 :(得分:4)
你的第二个命令完全覆盖了第一个命令。你想要的是
df <- data.frame(id=id, nobs=nobs)
由于您对cbind的输入是向量(我假设),因此默认情况下它返回一个矩阵。
此外,您可以通过
将其强制为数据框df <- data.frame(cbind(id, nobs))
但这太过分了。
答案 1 :(得分:0)
注意:我不建议您使用这些方法中的任何一种。如果你想要一个data.frame
,你可以像Paul所展示的那样直接创建它(或者你自己已经完成了)。这只是为了说明为什么会发生这种情况。虽然有时在使用sapply
时,输出将是一个矩阵,您可能希望绑定2个这样的矩阵并将它们作为data.frame
。
来自cbind
(?cbind
)的帮助页面:
函数cbind和rbind是S3泛型的,具有数据帧的方法。如果至少有一个参数是数据框,其余的是矢量或矩阵,则使用数据帧方法。
数据框架方法
cbind数据框方法只是data.frame(...,check.names = FALSE)的包装器。这意味着它将在数据框参数中拆分矩阵列,并将字符列转换为因子,除非指定stringsAsFactors = FALSE。
因此,如果传递两个向量,则不会调用data.frame
的包装器。因此,您获得矩阵。
你能做什么? 1)您可以创建至少一个
data.frame
参数并将其传递给cbind
2)用cbind
包装as.data.frame(.)
参数。
x <- 1:5
y <- 6:10
> cbind(data.frame(x), y)
x y
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
> as.data.frame(cbind(x,y))
x y
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10