如何计算具有多个行长的数据框中的新变量?

时间:2017-09-06 12:07:25

标签: r loops dataframe dplyr apply

我有以下data.frame(df)包含每个产品购买概率的不同用户。

   ID    P1    P2    P3    P4    P5    P6    P7    P8    P9    P10
1  1     .1    .2    .1    .5    .8    NA    NA    .7    .4    NA 
2  2     .4    NA    NA    .3    .7    .8    NA    .5    .8    NA 
3  3     .3    .1    NA    .9    NA    .5    .1    .2    .1    .1 
4  4     .5    NA    NA    NA    NA    .5    .1    NA    NA    .1 


在我的分析中,我分类了不同的产品类别。
例如,P2,P3,P4和P5与CLASS1相关。
预期输出:我想计算每个产品类别的每个用户的不同方式。

我现在的问题是,在指定的类中没有任何概率的用户(例如此处为user4)。这就是我的计算输出比我的数据帧少的原因。

我正在寻找一种优雅的方法来有效地编码这个问题。

我已经尝试过这样做并因为我的df和我的新变量长度不同而得到错误

df$class1 <- rowMeans(filter(df[,3:6], df$P2 > 0 | df$P3 > 0 | df$P4 > 0 | df$P5 > 0), na.rm=T)

2 个答案:

答案 0 :(得分:1)

如果我理解正确的话,那就是dplyr方式:

library(dplyr)
test <- data.frame(P1 = c(0.1, NA, NA), P2 = c(NA, 0.2, 0.3), P3 = c(0.4, 0.5, NA))
test <- test %>% mutate(meanA = rowMeans(select(., P1, P2, P3), na.rm = T))

答案 1 :(得分:0)

数据

df <- structure(list(ID = 1:4, P1 = c(0.1, 0.4, 0.3, 0.5), P2 = c(0.2, 
NA, 0.1, NA), P3 = c(0.1, NA, NA, NA), P4 = c(0.5, 0.3, 0.9, 
NA), P5 = c(0.8, 0.7, NA, NA), P6 = c(NA, 0.8, 0.5, 0.5), P7 = c(NA, 
NA, 0.1, 0.1), P8 = c(0.7, 0.5, 0.2, NA), P9 = c(0.4, 0.8, 0.1, 
NA), P10 = c(NA, NA, 0.1, 0.1)), .Names = c("ID", "P1", "P2", 
"P3", "P4", "P5", "P6", "P7", "P8", "P9", "P10"), row.names = c(NA, 
-4L), class = c("data.table", "data.frame"))

溶液

df$class1 <- rowMeans(df[,3:6], na.rm=T)

输出

   ID  P1  P2  P3  P4  P5  P6  P7  P8  P9 P10 class1
1:  1 0.1 0.2 0.1 0.5 0.8  NA  NA 0.7 0.4  NA    0.4
2:  2 0.4  NA  NA 0.3 0.7 0.8  NA 0.5 0.8  NA    0.5
3:  3 0.3 0.1  NA 0.9  NA 0.5 0.1 0.2 0.1 0.1    0.5
4:  4 0.5  NA  NA  NA  NA 0.5 0.1  NA  NA 0.1    NaN