基于多个条件的多列中特定数字的移动概率和移动平均值

时间:2019-05-22 02:56:32

标签: r dplyr mutate

我有一个如下所示的面板数据集。


+----+---+---------+---------+---------+---------+---------+---------+---------+---------+---------+
| 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)创建两个新变量。

  1. probcount_2 :当t<=1时,它始终等于0.5,但对于t>1,它会计算数字2的运行概率(从列包含数字2和7的value_1到value_9

  2. 平均值_ 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 |
+----+---+---------+---------+---------+---------+---------+---------+---------+---------+---------+-------------+------------+

任何建议将不胜感激。

2 个答案:

答案 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