我来自Python,所以我习惯于处理行名的数据。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这对我来说几乎是危险的;特别是因为新的数据框架又有了行名a和b。为什么要这么做?我怎么能让R尊重行名?
编辑:如果我设置了x = data.frame(x)和y = data.frame(y),问题就不会消失。
发布于 2018-03-29 12:12:00
这里有一个使用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)))指定冒号和行名(列和行的顺序颠倒)
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发布于 2018-03-29 12:33:46
首先,这些是矩阵,不是数据帧,但它们都有执行矩阵计算的问题。原因是对于R,矩阵计算是基于使用相同的行号而不是相同的行名。然后,使用方程中第一个矩阵中的行名来查看行名。例如:
> y+x
[,1] [,2]
b 0 0
a 2 2现在行名是基于y而不是x的。
如果要将添加的内容基于行名,则应指定行名。
> 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 1https://stackoverflow.com/questions/49555411
复制相似问题