我正在尝试在不使用r中的forloop的情况下测试我的数据帧的每一行以获得条件,并且返回是与条件对应的单独矩阵的元素。这是一个例子:
ax <- matrix(data=c("x","UP","DN","x"),nrow=2,dimnames=list(c("site1","site2"),c("site1","site2")))
data <- data.frame(Location1=c("site1","site1","site2","site1","site2","site2","site2","site1"),Location2=c("site1","site2","site1","site2","site2","site2","site1","site1"))
这导致矩阵(ax)和数据帧(数据):
> ax
site1 site2
site1 "x" "DN"
site2 "UP" "x"
> data
Location1 Location2
1 site1 site1
2 site1 site2
3 site2 site1
4 site1 site2
5 site2 site2
6 site2 site2
7 site2 site1
8 site1 site1
现在如果location1与位置2不同,我想得到相应的矩阵元素,告诉我该运动的方向。我之前使用过ifelse这样的语句,但是在尝试查询单独的矩阵时,获取正确的输出真的让我不知所措。我的代码是:
data$movement <-ifelse(data$Location1!=data$Location2,ax[as.character(data$Location1),as.character(data$Location2)],"x")
但这导致了这个输出:
data
Location1 Location2 movement
1 site1 site1 x
2 site1 site2 x
3 site2 site1 UP
4 site1 site2 x
5 site2 site2 x
6 site2 site2 x
7 site2 site1 UP
8 site1 site1 x
这似乎是一个简单的问题,但我似乎无法弄清楚,任何帮助都非常感谢
答案 0 :(得分:5)
您实际上可以使用行和列名称或索引的矩阵来对矩阵进行子集化。
使用这种表示法,你的问题是一个问题:
data$movement = ax[as.matrix(data)]
data
# Location1 Location2 movement
# 1 site1 site1 x
# 2 site1 site2 DN
# 3 site2 site1 UP
# 4 site1 site2 DN
# 5 site2 site2 x
# 6 site2 site2 x
# 7 site2 site1 UP
# 8 site1 site1 x
您的ifelse
无法正常工作,因为ifelse
想要测试,是的结果,并且没有结果都是相同长度的矢量。然而,你的结果是:
ax[as.character(data$Location1),as.character(data$Location2)]
# site1 site2 site1 site2 site2 site2 site1 site1
# site1 "x" "DN" "x" "DN" "DN" "DN" "x" "x"
# site1 "x" "DN" "x" "DN" "DN" "DN" "x" "x"
# site2 "UP" "x" "UP" "x" "x" "x" "UP" "UP"
# site1 "x" "DN" "x" "DN" "DN" "DN" "x" "x"
# site2 "UP" "x" "UP" "x" "x" "x" "UP" "UP"
# site2 "UP" "x" "UP" "x" "x" "x" "UP" "UP"
# site2 "UP" "x" "UP" "x" "x" "x" "UP" "UP"
# site1 "x" "DN" "x" "DN" "DN" "DN" "x" "x"
很容易被强制转换为矢量,但是它的长度是错误的。此矩阵的对角线是您想要的结果,因此您可以在diag(ax[as.character(data$Location1),as.character(data$Location2)])
中使用ifelse
,或者您甚至可以使用
data$movement = diag(ax[as.character(data$Location1), as.character(data$Location2)])
但上述方式更好。