R-如何在具有多行长度的数据框中计算新变量



i具有以下数据。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)

如果我正确理解您,这将是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))

data

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

最新更新