我来自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 a
和b
。
这个bevahior的原因是什么?如何告诉R尊重行名?
修改:如果我设置x = data.frame(x)
和y = data.frame(y)
,问题就不会消失。
答案 0 :(得分:0)
这是使用data.frame
代替matrix
的解决方案:
两个data.frame x
和y
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