ifelse语句在R中返回条件矩阵元素

时间:2016-10-21 23:05:18

标签: r if-statement

我正在尝试在不使用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

这似乎是一个简单的问题,但我似乎无法弄清楚,任何帮助都非常感谢

1 个答案:

答案 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)])

但上述方式更好。