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

sc7*_*c73 3 if-statement r

我试图在不使用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"))
Run Code Online (Sandbox Code Playgroud)

这导致矩阵(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        
Run Code Online (Sandbox Code Playgroud)

现在,如果location1与位置2不同,我想得到相应的矩阵元素,告诉我该运动的方向.我之前使用过ifelse这样的语句,但是在尝试查询单独的矩阵时,获取正确的输出实际上是我的意思.我的代码是:

data$movement <-ifelse(data$Location1!=data$Location2,ax[as.character(data$Location1),as.character(data$Location2)],"x")
Run Code Online (Sandbox Code Playgroud)

但这导致了这个输出:

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
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*gor 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
Run Code Online (Sandbox Code Playgroud)

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"  
Run Code Online (Sandbox Code Playgroud)

很容易被强制转换为矢量,但它的长度是错误的.对角矩阵这是你想要的结果,所以你可以使用diag(ax[as.character(data$Location1),as.character(data$Location2)])ifelse,或者你甚至可以用

data$movement = diag(ax[as.character(data$Location1), as.character(data$Location2)])
Run Code Online (Sandbox Code Playgroud)

但上面的方式更好.