如何在满足条件之前和之后选择数据框中的行?

时间:2017-11-17 13:58:59

标签: r dataframe

我现在正在网上搜索几天,我找不到解决方案(可能很容易解决)。

我有大量数据框,包含4个变量,每个变量超过一百万个。现在我想要选择100行,满足特定条件后的所有行和1000行,并用NA填充其余行。我尝试使用for循环和if / ifelse,但到目前为止它不起作用。我认为它不应该是一件大事,但是目前我还没有掌握它。

我使用以下方法创建数据:

foo<-data.frame(t = 1:15, a = sample(1:15), b = c(1,1,1,1,1,4,4,4,4,1,1,1,1,1,1), c = sample(1:15))

我的数据如下:

ID    t   a   b   c
1     1   4   1   7
2     2   7   1   10
3     3   10  1   6
4     4   2   1   4
5     5   13  1   9
6     6   15  4   3
7     7   8   4   15
8     8   3   4   1
9     9   9   4   2
10   10   14  1   8
11   11   5   1   11
12   12   11  1   13
13   13   12  1   5
14   14   6   1   14
15   15   1   1   12

我想要的是选择a(在此示例中)之前2行的值,b值之后的所有行和3行之后的所有行都是&gt;并填充其余行NA的。 [因为这只是一个例子,我猜你可以想象在这15行之后有更多行,b的值从1变为4几次(我没有发布,所以我不会垃圾邮件有不必要数据的问题)。] 所以我希望得到类似的东西:

ID    t   a   b   c   d
1     1   4   1   7  NA
2     2   7   1   10 NA 
3     3   10  1   6  NA 
4     4   2   1   4   2
5     5   13  1   9  13 
6     6   15  4   3  15 
7     7   8   4   15  8
8     8   3   4   1   3
9     9   9   4   2   9
10   10   14  1   8  14 
11   11   5   1   11  5
12   12   11  1   13 11 
13   13   12  1   5  NA 
14   14   6   1   14 NA 
15   15   1   1   12 NA 

我很感谢你的帮助。

谢谢。

祝你好运, 克里斯

3 个答案:

答案 0 :(得分:1)

这是一次尝试。

获取满足条件b > 1

的索引
z <- which(foo$b > 1)

获取(z - 2) : (z + 3)

的索引
ind <- unique(unlist(lapply(z, function(x){
  g <- pmax(x - 2, 1) #if x - 2 is negative
  g : (x + 3)
})))

创建d列填充NA

foo$d <- NA

使用foo$a

替换具有适当索引的元素
foo$d[ind] <- foo$a[ind]

答案 1 :(得分:1)

这是与missuse相同的尝试,但是使用data.table:

library(data.table)
foo<-data.frame(t = 1:11, a = sample(1:11), b = c(1,1,1,4,4,4,4,1,1,1,1), c = sample(1:11))
DT <- setDT(foo)
DT[ unique(c(DT[,.I[b>1] ],DT[,.I[b>1]+3 ],DT[,.I[b>1]-2 ])), d := a]

     t  a b  c  d
 1:  1 10 1  2 NA
 2:  2  6 1 10  6
 3:  3  5 1  7  5
 4:  4 11 4  4 11
 5:  5  4 4  9  4
 6:  6  8 4  5  8
 7:  7  2 4  8  2
 8:  8  3 1  3  3
 9:  9  7 1  6  7
10: 10  9 1  1  9
11: 11  1 1 11 NA

下面

unique(c(DT[,.I[b>1] ],DT[,.I[b>1]+3 ],DT[,.I[b>1]-2 ]))

为您提供所需的indixes:条件行的唯一索引,相同的索引+ 3和-2。

答案 2 :(得分:0)

library(dplyr)
library(purrr)

# example dataset
foo<-data.frame(t = 1:15, 
                a = sample(1:15), 
                b = c(1,1,1,1,1,4,4,4,4,1,1,1,1,1,1), 
                c = sample(1:15))

# function to get indices of interest
# for a given index x go 2 positions back and 3 forward
# keep only positive indices
GetIDsBeforeAfter = function(x) {
  v = (x-2) : (x+3)
  v[v > 0]
}


foo %>%                        # from your dataset
  filter(b > 1) %>%            # keep rows where b > 1
  pull(t) %>%                  # get the positions
  map(GetIDsBeforeAfter) %>%   # for each position apply the function
  unlist() %>%                 # unlist all sets indices
  unique() -> ids_to_remain    # keep unique ones and save them in a vector

foo$d = foo$c                  # copy column c as d
foo$d[-ids_to_remain] = NA     # put NA to all positions not in our vector

foo  

#     t  a b  c  d
# 1   1  5 1  8 NA
# 2   2  6 1 14 NA
# 3   3  4 1 10 NA
# 4   4  1 1  7  7
# 5   5 10 1  5  5
# 6   6  8 4  9  9
# 7   7  9 4 15 15
# 8   8  3 4  6  6
# 9   9  7 4  2  2
# 10 10 12 1  3  3
# 11 11 11 1  1  1
# 12 12 15 1  4  4
# 13 13 14 1 11 NA
# 14 14 13 1 13 NA
# 15 15  2 1 12 NA