根据每列的条件选择行

时间:2018-01-24 13:15:07

标签: r subset

我有实验室正在分析的数据,而且我是第一次尝试使用R.

我一直在阅读根据条件选择行,但我似乎无法找到为我的数据执行此操作的方法。

我创建了一个数据框,但我没有为列命名。每个柱子是我正在测试的细菌物种的特定变体,并且在约15小时的时间内其OD /吸光度值(每列总共56行)的增加值。

我想从EACH列中选择值为0.2到0.4的行。

A section of my data frame

理想情况下,我想要的是:

   V1       V2
9  0.2100  7 0.2181
10 0.3017  8 0.3162
11 0.4079  9 0.4137

我想我可以从每列手动选择行,但必须有更快的方法。

然后,我计划计算子集中每列的平均值。

非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

在这个例子中,你会得到一个列表,其中每个变量的值向量介于0.2到0.4之间。希望它有所帮助

df=data.frame(V1=c(1,0.3,2,.1,.5,8,.1,.4,.35,.22,6),V2=c(0.2,0.3,3,.15,.32,5,.1,.45,.35,.3,6))
filteredColumns<-sapply(df,function(x) x[x>0.2&x<0.4])

答案 1 :(得分:0)

这样做:

y

该函数将在向量x中查找最接近z的值,受限制set.seed(123) df <- data.frame(x = rnorm(100), y = rnorm(100)) sapply(df, findNearest3, .3, c(.2, .4)) x y [1,] 0.2533185 0.2982276 [2,] 0.3035286 0.3011534 [3,] 0.3317820 0.3104807 约束,并返回此值加上排序向量之前和之后的值。< / p>

示例:

sapply(df, function(x) mean(findNearest3(x, .3, c(.2, .4))))

现在用

        x         y 
0.2962097 0.3032872 

你会得到手段:

NA

请注意,如果给定约束z中的值不足,则会返回df <- data.frame(x = c(.1, .23, .35, .5), y = c(.22, .24, .33, .48)) > sapply(df, findNearest3, .3, c(.2, .4)) x y [1,] 0.23 0.24 [2,] 0.35 0.33 [3,] NA NA > sapply(df, function(x) mean(findNearest3(x, .3, c(.2, .4)), na.rm = T)) x y 0.290 0.285

findNearest3.pos <- function(x, y){
  temp <- sort(x)
  point <- which(abs(temp-y)==min(abs(temp-y)))
  return(c(point-1, point, point+1))
}

编辑:要返回值的行位置而不是值本身,只需更改代码的最后一行:

myrows <- lapply(df, findNearest3.pos, y = .3)

应用: 要在相同维度的另一个数据框上使用它,首先要将位置保存在列表中:

set.seed(234)
df1 <- data.frame(x = rnorm(100), y = rnorm(100))

newsubset <- mapply(function(x, y) x[y], df1, myrows)
              x        y
[1,] -0.9581388 2.214151
[2,]  0.6280635 0.455070
[3,]  0.6625872 0.513053

然后将第二个数据框子集化:

set.seed(345)
df2 <- data.frame(x = rnorm(100))

考虑到只有一列的其他数据框,您需要确定要使用哪一列的行位置。

V1

您可以访问x(或在此示例中为df2[myrows[[1]],] [1] 0.2986353 -0.9917691 -0.6510206 )中找到的行位置:

V2

以及y(此处命名为df2[myrows[[2]],] [1] -0.3148442 -0.2491949 0.6854260 )中包含的内容:

{{1}}