从一列返回值以另一列为条件

时间:2018-02-21 13:53:41

标签: r dataframe apply lapply

我有一个宽data.frame表示对列的行和时间段的观察。我在每个A个时间段内有两个变量B10。变量A是二进制的,变量B是连续的。

我想在数据框中创建一个新列,按行返回与第一次B对应的A == 1的值,确保忽略NA如果未达到1,则转到下一列(我想象na.rm=TRUE)。

这是数据(仅使用3个时间段,而不是10个,这是非常罕见的):

structure(list(A.1 = c(1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
A.2 = c(1L, NA, 0L, 0L, NA, 0L, NA, NA, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, NA, NA, 0L, 0L, 0L, NA), A.3 = c(NA, 
NA, 1L, NA, NA, 0L, NA, NA, NA, 0L, NA, NA, NA, NA, 0L, NA, 
0L, NA, 0L, NA, NA, NA, 0L, NA, NA), B.1 = c(63L, 58L, 87L, 
60L, 67L, 58L, 67L, 50L, 77L, 57L, 57L, 65L, 55L, 65L, 61L, 
61L, 67L, 75L, 79L, 68L, 53L, 73L, 77L, 77L, 69L), B.2 = c(64L, 
NA, 88L, 63L, NA, 59L, NA, NA, 79L, 58L, 58L, 66L, 57L, 67L, 
62L, 62L, 68L, 77L, 80L, NA, NA, 74L, 78L, 78L, NA), B.3 = c(NA, 
NA, 90L, NA, NA, 60L, NA, NA, NA, 59L, NA, NA, NA, NA, 63L, 
NA, 69L, NA, 82L, NA, NA, NA, 79L, NA, NA)), .Names = c("A.1", 
"A.2", "A.3", "B.1", "B.2", "B.3"), row.names = c(1L, 3L, 4L, 
8L, 10L, 11L, 14L, 15L, 16L, 18L, 21L, 23L, 25L, 27L, 29L, 34L, 
36L, 44L, 46L, 51L, 52L, 53L, 55L, 58L, 60L), class = "data.frame")

最后一列应该返回第一个值63,第二个值返回NA,第三个值返回90等等。

谢谢!

2 个答案:

答案 0 :(得分:0)

这是apply的一种方式:

df1$C <-
  apply(df1,1,function(x){
    i <- match(1,head(x,length(x)/2))
    if (length(i)) tail(x,length(x)/2)[i] else NA
  })

df1
#    A.1 A.2 A.3 B.1 B.2 B.3  C
# 1    1   1  NA  63  64  NA 63
# 3    0  NA  NA  58  NA  NA NA
# 4    0   0   1  87  88  90 90
# 8    0   0  NA  60  63  NA NA
# 10   0  NA  NA  67  NA  NA NA
# 11   0   0   0  58  59  60 NA
# 14   0  NA  NA  67  NA  NA NA
# 15   0  NA  NA  50  NA  NA NA
# 16   0   0  NA  77  79  NA NA
# 18   0   0   0  57  58  59 NA
# 21   0   0  NA  57  58  NA NA
# 23   0   0  NA  65  66  NA NA
# 25   0   1  NA  55  57  NA 57
# 27   0   0  NA  65  67  NA NA
# 29   0   0   0  61  62  63 NA
# 34   0   0  NA  61  62  NA NA
# 36   0   0   0  67  68  69 NA
# 44   0   0  NA  75  77  NA NA
# 46   0   0   0  79  80  82 NA
# 51   0  NA  NA  68  NA  NA NA
# 52   0  NA  NA  53  NA  NA NA
# 53   0   0  NA  73  74  NA NA
# 55   0   0   0  77  78  79 NA
# 58   0   0  NA  77  78  NA NA
# 60   0  NA  NA  69  NA  NA NA

如果您的表格中有其他列,则无法正常工作,只需将head(x,length(x)/2))替换为x[A_indices](例如x[3:12])和tail(x,length(x)/2))替换{{ 1}}(例如x[B_indices]),它应该有效。

为了便于比较,这是一个x[13:22]解决方案:

tidyverse

答案 1 :(得分:0)

这是你的解决方案人:

for(i in 1:nrow(test)){
  new <- (((test[i, 4:6] [grepl(x=test[i, 1:3],pattern= "1")])))
  test[i, "new"] <- ifelse(dim(new)[2] == 1, new[[1]], NA)
}

请相应调整列索引。请原谅我有点凌乱的代码,因为我已经匆忙,但不能停止思考你的问题。

希望我的代码可以帮助您获得所需的结果。

有一个好人和欢呼,

Jatin。