我有一个如下所示的面板数据集。
+----+---+---------+---------+---------+---------+---------+---------+---------+---------+---------+
| id | t | value_1 | value_2 | value_3 | value_4 | value_5 | value_6 | value_7 | value_8 | value_9 |
+----+---+---------+---------+---------+---------+---------+---------+---------+---------+---------+
| 1 | 1 | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| 1 | 2 | 2 | NA | NA | NA | NA | NA | NA | NA | NA |
| 1 | 2 | 2 | 2 | NA | NA | NA | NA | NA | NA | NA |
| 1 | 3 | 2 | 2 | 5 | NA | NA | NA | NA | NA | NA |
| 1 | 4 | 2 | 2 | 5 | 2 | NA | NA | NA | NA | NA |
| 1 | 5 | 2 | 2 | 5 | 2 | 7 | NA | NA | NA | NA |
| 1 | 6 | 2 | 2 | 5 | 2 | 7 | 7 | NA | NA | NA |
| 1 | 7 | 2 | 2 | 5 | 2 | 7 | 7 | 2 | NA | NA |
| 1 | 8 | 2 | 2 | 5 | 2 | 7 | 7 | 2 | 2 | NA |
| 1 | 9 | 2 | 2 | 5 | 2 | 7 | 7 | 2 | 2 | 2 |
| 2 | 0 | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| 2 | 1 | 5 | NA | NA | NA | NA | NA | NA | NA | NA |
| 2 | 2 | 5 | 2 | NA | NA | NA | NA | NA | NA | NA |
| 2 | 3 | 5 | 2 | 2 | NA | NA | NA | NA | NA | NA |
| 2 | 4 | 5 | 2 | 2 | 2 | NA | NA | NA | NA | NA |
| 2 | 5 | 5 | 2 | 2 | 2 | 7 | NA | NA | NA | NA |
| 2 | 6 | 5 | 2 | 2 | 2 | 7 | 7 | NA | NA | NA |
| 2 | 7 | 5 | 2 | 2 | 2 | 7 | 7 | 2 | NA | NA |
| 2 | 8 | 5 | 2 | 2 | 2 | 7 | 7 | 2 | 2 | NA |
| 2 | 9 | 5 | 2 | 2 | 2 | 7 | 7 | 2 | 2 | 2 |
+----+---+---------+---------+---------+---------+---------+---------+---------+---------+---------+
使用此数据集,我想在 value_1至value_9 列中基于数字2和7(根本不考虑数字5)创建两个新变量。
probcount_2 :当t<=1
时,它始终等于0.5,但对于t>1
,它会计算数字2的运行概率(从列包含数字2和7的value_1到value_9 。
平均值_ 27 :当t<=1
始终等于4.5(平均值2和7),但是对于t>1
,它计算的平均值为2和7(从包含数字2和7的 value_1到value_9 列)。
我希望获得以下输出。
+----+---+---------+---------+---------+---------+---------+---------+---------+---------+---------+-------------+------------+
| id | t | value_1 | value_2 | value_3 | value_4 | value_5 | value_6 | value_7 | value_8 | value_9 | probcount_2 | average_27 |
+----+---+---------+---------+---------+---------+---------+---------+---------+---------+---------+-------------+------------+
| 1 | 1 | NA | NA | NA | NA | NA | NA | NA | NA | NA | 0.5 | 4.5 |
| 1 | 2 | 2 | NA | NA | NA | NA | NA | NA | NA | NA | 1 | 2 |
| 1 | 2 | 2 | 2 | NA | NA | NA | NA | NA | NA | NA | 1 | 2 |
| 1 | 3 | 2 | 2 | 5 | NA | NA | NA | NA | NA | NA | 1 | 2 |
| 1 | 4 | 2 | 2 | 5 | 2 | NA | NA | NA | NA | NA | 1 | 2 |
| 1 | 5 | 2 | 2 | 5 | 2 | 7 | NA | NA | NA | NA | 0.75 | 3.25 |
| 1 | 6 | 2 | 2 | 5 | 2 | 7 | 7 | NA | NA | NA | 0.60 | 4 |
| 1 | 7 | 2 | 2 | 5 | 2 | 7 | 7 | 2 | NA | NA | 0.66 | 3.7 |
| 1 | 8 | 2 | 2 | 5 | 2 | 7 | 7 | 2 | 2 | NA | 0.71 | 3.45 |
| 1 | 9 | 2 | 2 | 5 | 2 | 7 | 7 | 2 | 2 | 2 | 0.75 | 3.25 |
| 2 | 0 | NA | NA | NA | NA | NA | NA | NA | NA | NA | 0.5 | 4.5 |
| 2 | 1 | 5 | NA | NA | NA | NA | NA | NA | NA | NA | 0.5 | 4.5 |
| 2 | 2 | 5 | 2 | NA | NA | NA | NA | NA | NA | NA | 1 | 2 |
| 2 | 3 | 5 | 2 | 2 | NA | NA | NA | NA | NA | NA | 1 | 2 |
| 2 | 4 | 5 | 2 | 2 | 2 | NA | NA | NA | NA | NA | 1 | 2 |
| 2 | 5 | 5 | 2 | 2 | 2 | 7 | NA | NA | NA | NA | 0.75 | 3.25 |
| 2 | 6 | 5 | 2 | 2 | 2 | 7 | 7 | NA | NA | NA | 0.60 | 4 |
| 2 | 7 | 5 | 2 | 2 | 2 | 7 | 7 | 2 | NA | NA | 0.66 | 3.7 |
| 2 | 8 | 5 | 2 | 2 | 2 | 7 | 7 | 2 | 2 | NA | 0.71 | 3.45 |
| 2 | 9 | 5 | 2 | 2 | 2 | 7 | 7 | 2 | 2 | 2 | 0.75 | 3.25 |
+----+---+---------+---------+---------+---------+---------+---------+---------+---------+---------+-------------+------------+
任何建议将不胜感激。
答案 0 :(得分:1)
仅使用base R
,一种选择是遍历行,提取2或7的元素,获得逻辑向量{'i1'}的mean
和{{1 }}的值子集
mean
或者我们可以使用df[c("probcount_2", "average_27")] <- t(apply(df[-(1:2)], 1,
function(x) {
x1 <- x[x %in% c(2, 7)]
i1 <- x1 == 2
c(if(length(i1) == 0) 0.5 else mean(i1),
if(length(i1) ==0) 4.5 else mean(x1))
}))
df
# id t value_1 value_2 value_3 value_4 value_5 value_6 value_7 value_8 value_9 probcount_2 average_27
#1 1 1 NA NA NA NA NA NA NA NA NA 0.5000000 4.500000
#2 1 2 2 NA NA NA NA NA NA NA NA 1.0000000 2.000000
#3 1 2 2 2 NA NA NA NA NA NA NA 1.0000000 2.000000
#4 1 3 2 2 5 NA NA NA NA NA NA 1.0000000 2.000000
#5 1 4 2 2 5 2 NA NA NA NA NA 1.0000000 2.000000
#6 1 5 2 2 5 2 7 NA NA NA NA 0.7500000 3.250000
#7 1 6 2 2 5 2 7 7 NA NA NA 0.6000000 4.000000
#8 1 7 2 2 5 2 7 7 2 NA NA 0.6666667 3.666667
#9 1 8 2 2 5 2 7 7 2 2 NA 0.7142857 3.428571
#10 1 9 2 2 5 2 7 7 2 2 2 0.7500000 3.250000
#11 2 0 NA NA NA NA NA NA NA NA NA 0.5000000 4.500000
#12 2 1 5 NA NA NA NA NA NA NA NA 0.5000000 4.500000
#13 2 2 5 2 NA NA NA NA NA NA NA 1.0000000 2.000000
#14 2 3 5 2 2 NA NA NA NA NA NA 1.0000000 2.000000
#15 2 4 5 2 2 2 NA NA NA NA NA 1.0000000 2.000000
#16 2 5 5 2 2 2 7 NA NA NA NA 0.7500000 3.250000
#17 2 6 5 2 2 2 7 7 NA NA NA 0.6000000 4.000000
#18 2 7 5 2 2 2 7 7 2 NA NA 0.6666667 3.666667
#19 2 8 5 2 2 2 7 7 2 2 NA 0.7142857 3.428571
#20 2 9 5 2 2 2 7 7 2 2 2 0.7500000 3.250000
rowMeans
m1 <- replace(as.matrix(df[-(1:2)]), !as.matrix(df[-(1:2)]) %in% c(2, 7), NA)
df$probcount_2 <- rowMeans(m1 == 2, na.rm = TRUE)
df$average_27 <- rowMeans(m1, na.rm = TRUE)
i1 <- df$t <= 1
df[i1, c("probcount_2", "average_27")] <- list(0.5, 4.5)
答案 1 :(得分:1)
由于我们仅对值2和7感兴趣,因此我们可以将其余值更改为NA
,然后执行计算。使用dplyr
可以做到
library(dplyr)
df %>%
mutate_at(vars(starts_with("value")), ~replace(., !. %in% c(2, 7), NA)) %>%
mutate(probcount_2 = ifelse(t <= 1, 0.5,
rowSums(.[3:11] == 2, na.rm = TRUE)/rowSums(!is.na(.[3:11]), na.rm = TRUE)),
average_27 = ifelse(t <= 1, 4.5, rowMeans(.[3:11], na.rm = TRUE))) %>%
select(id, t, probcount_2, average_27)
# id t probcount_2 average_27
#1 1 1 0.500 4.50
#2 1 2 1.000 2.00
#3 1 2 1.000 2.00
#4 1 3 1.000 2.00
#5 1 4 1.000 2.00
#6 1 5 0.750 3.25
#7 1 6 0.600 4.00
#8 1 7 0.667 3.67
#9 1 8 0.714 3.43
#10 1 9 0.750 3.25
#11 2 0 0.500 4.50
#12 2 1 0.500 4.50
#13 2 2 1.000 2.00
#14 2 3 1.000 2.00
#15 2 4 1.000 2.00
#16 2 5 0.750 3.25
#17 2 6 0.600 4.00
#18 2 7 0.667 3.67
#19 2 8 0.714 3.43
#20 2 9 0.750 3.25