我有一个宽data.frame
表示对列的行和时间段的观察。我在每个A
个时间段内有两个变量B
和10
。变量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
等等。
谢谢!
答案 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。