如何使用R从数组中选择行?

问题描述 投票:0回答:3

假设我有一个名为sims_add_dom且具有dim(100,5,100)的数组:

sims_add_dom <- structure(list(marker = 1:10, coeff_a = c(0.1814993012, -1.2206119381, 
-0.298198096, 0.1131342646, 1.2563355045, 0.7464163985, 0.0002634054, 
0.1154037559, 0.3739666234, 1.8235592343), Pvalue_a = c(0.7449502, 
0.001649993, 0.4299404, 0.7704995, 0.07119358, 0.1737651, 0.9996618, 
0.7814851, 0.5222457, 1.616549e-05), coeff_d = c(-2.36629627, 
2.54339395, 0.16246537, -0.14700687, -0.82243816, 0.9682112, 
NA, -0.55876864, -2.18497032, -4.78780087), Pvalue_d = c(0.3925707, 
0.00146736, 0.820999, 0.8413498, 0.7667223, 0.7268808, NA, 0.3931673, 
0.2660354, 2.889129e-06)), class = "data.frame", row.names = c(NA, 
-10L))

现在,我要基于变量Pvalue_aPvalue_d上的某些条件选择行。假设,如果Pvalue_a < 0.05Pvalue_d < 0.05的值,则选择这些行及其关联的值。

实际上,我想知道根据条件有多少估计量是有效的。我在google和StackOverflow上进行了搜索,但没有找到我问题的直接答案。

如果有人帮助我解决这个问题,我将非常感激。谢谢您的帮助。

示例数据集:

“

r arrays select conditional-statements
3个回答
0
投票

[注意,要从复制中获取数组,输出应为矩阵,这是您在屏幕快照中显示的内容,而不是在dput()中显示的内容。

模拟数据的方法:

func = function(){
  a = rnorm(50)
  d = rnorm(50)
  markers = matrix(as.numeric(runif(50*100)>0.5),
                   nrow=50)

  res = sapply(1:ncol(markers),function(i){
    fit = lm(cbind(a,d)~markers[,i])
    res = do.call(rbind,coefficients(summary(fit)))
    c(i,res[2,1],res[2,4],res[4,1],res[4,4])
  })
  res = t(res)
  colnames(res) = c("marker","coeff_a","Pvalue_a","coeff_d","Pvalue_d")
  return(res)
}

sims_add_dom = replicate(10,func())

我只做了10次,但结构类似:

dim(sims_add_dom)
[1] 100   5  10

现在获得那些p <0.05的a或d:

sig = lapply(seq(dim(sims_add_dom)[3]), function(x){
  M = sims_add_dom[ , , x]
  M[M[,"Pvalue_d"]<0.05 | M[,"Pvalue_d"]<0.05, ]
})

head(sig[[1]])
     marker    coeff_a  Pvalue_a    coeff_d   Pvalue_d
[1,]      7 -0.1579199 0.6422984 -0.6462950 0.01672552
[2,]      9 -0.0648256 0.8474612  0.6091641 0.02316872
[3,]     17  0.3098400 0.3558238 -0.5721621 0.03352941
[4,]     54  0.3766042 0.2591446  0.5370216 0.04593391
[5,]     77 -0.2054801 0.5413273  0.5974129 0.02611847

获取电话号码:

sapply(sig,nrow)

0
投票

返回符合条件的行:

> sims_add_dom[which(sims_add_dom$Pvalue_a < 0.05 | sims_add_dom$Pvalue_d < 0.05), c("Pvalue_a", "Pvalue_d")]
       Pvalue_a     Pvalue_d
2  1.649993e-03 1.467360e-03
10 1.616549e-05 2.889129e-06

计算符合条件的行

> sum(sims_add_dom$Pvalue_a < 0.05 | sims_add_dom$Pvalue_d < 0.05, na.rm = TRUE)
[1] 2

0
投票

这里是另一个使用dplyr软件包的解决方案。首先获取满足条件的行

library(dplyr)

sims_add_dom %>%
  filter(Pvalue_a < 0.05 | Pvalue_d < 0.05)

然后计算满足条件的行数

#Count how many rows meet the condition
sims_add_dom %>%
  filter(Pvalue_a < 0.05 | Pvalue_d < 0.05) %>%
  count()
© www.soinside.com 2019 - 2024. All rights reserved.