在R中,ifelse语句可以返回一个条件矩阵元素。

3

我想在R语言中测试数据框的每一行是否满足条件,而不使用for循环,并使返回值成为与条件相对应的矩阵元素。以下是一个示例:

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)和数据框(data):
   > 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与location2不同,我想获取相应的矩阵元素,告诉我该运动的方向。我以前使用过类似于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个回答

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"  

这段文字描述了一个矩阵,该矩阵可以轻松转换为向量,但长度不正确。该矩阵的对角线是所需的结果,因此您可以在ifelse中使用diag(ax [as.character(data $ Location1),as.character(data $ Location2)]),或者甚至可以使用它。

data$movement = diag(ax[as.character(data$Location1), as.character(data$Location2)])

但是上述方法更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接