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