另外尊重rownames

时间:2018-03-29 11:56:50

标签: r

我来自Python Pandas,因此我习惯于在操作时尊重行名称的数据帧。 R似乎有不同的工作方式:

x = rbind(c(0, 0), c(1, 1))
rownames(x) = c("a", "b")

y = rbind(c(0, 0), c(1, 1))
rownames(y) = c("b", "a")

然后

> x + y
  [,1] [,2]
a    0    0
b    2    2

这似乎对我来说是危险的;特别是因为新数据框再次具有rownames ab。 这个bevahior的原因是什么?如何告诉R尊重行名?

修改:如果我设置x = data.frame(x)y = data.frame(y),问题就不会消失。

2 个答案:

答案 0 :(得分:0)

这是使用data.frame代替matrix的解决方案:

两个data.frame xy

x = data.frame(rbind(c(0, 0), c(1, 2)))
y = data.frame(rbind(c(0, 0), c(1, 1)))

指定colnames和rownames(列和行的顺序相反)

rownames(x) = c("a", "b")
rownames(y) = c("b", "a") 
colnames(x) = c("A", "B")
colnames(y) = c("B", "A")

x
  A B
a 0 0
b 1 2

y
  B A
b 0 0
a 1 1

您想要的输出:

x+y[match(rownames(x),rownames(y)),match(colnames(x),colnames(y))]
  A B
a 1 1
b 1 2

答案 1 :(得分:0)

首先,这些是矩阵,而不是数据框,但它们都有执行矩阵计算的问题。原因在于R,矩阵计算基于使用相同的行号而不是相同的行名。然后,它使用等式中第一个矩阵的rownames来查看rownames。例如:

> y+x
  [,1] [,2]
b    0    0
a    2    2

现在,rownames基于y而不是x

如果你想在rownames上添加附加内容,你应该指定rownames。

> x["a",] + y["a",]
[1] 1 1
> x["b",] + y["b",]
[1] 1 1

了解这一点,生成所需的矩阵应该很容易。

> rbind(a = x["a",] + y["a",], b = x["b",] + y["b",])
  [,1] [,2]
a    1    1
b    1    1