0

我有以下内容来创建数据框。我的问题是数据框行名称显示为 [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
4

2 回答 2

4

您的第二个命令完全覆盖第一个命令。你想要的是

df <- data.frame(id=id, nobs=nobs)

由于您对cbind的输入是向量(我假设),因此默认情况下它返回一个矩阵。

此外,您可以通过强制将其作为数据框

df <- data.frame(cbind(id, nobs))

但这太过分了。

于 2013-01-18T17:10:37.200 回答
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)cbindas.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
于 2013-01-18T17:15:19.890 回答