【发布时间】:2018-02-21 13:53:40
【问题描述】:
我有一个宽 data.frame 代表对行的观察和对列的时间段的观察。我在10 时间段中有两个变量A 和B。变量A 是二进制变量,变量B 是连续变量。
我想在数据框中创建一个新列,按行返回与第一次 A == 1 对应的 B 的值,确保忽略 NAs 并继续如果未达到 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,依此类推。
谢谢!
【问题讨论】:
-
with(df1, df1[A == 1, B ])这里df1是您的数据框。我不确定您的宽数据框是什么样的。请使用dput(df1)发布您的数据样本 -
with(df1, df1[ (!is.na(A)) & A == 1, ]) -
您的数据中没有一个
A ==1,也给我们您的预期输出,这使我们的生活变得更加轻松,并将帮助您提出有意义的示例数据 -
抱歉,数据非常稀缺,“A”变量中的更多 1 稍后会出现。希望这可以帮助! (这方面还是新的)