2

我的数据如下:

userID  <- c(1,1,1,2,2,2,3,3,3)
product <- c("a","a","a","b","b","c","a","b","c")
df <- data.frame(userID, product)

对于每个“用户 ID”,我想创建一个二进制指示变量,如果有多个唯一产品,则为 1,如果所有产品都相同,则为 0。

所以我的填充向量看起来像:

df$result <- c(0,0,0,1,1,1,1,1,1)
#    userID product result
# 1      1       a      0
# 2      1       a      0
# 3      1       a      0
# 4      2       b      1
# 5      2       b      1
# 6      2       c      1
# 7      3       a      1
# 8      3       b      1
# 9      3       c      1

例如,用户 1 只有一个不同的产品('a')-> 结果 = 0。用户 2 有多个唯一的产品('b' 和 'c')-> 结果 = 1。

4

4 回答 4

5

这是实现这一目标的一种方法

library(data.table)
setDT(df)[, result := as.integer(uniqueN(product) > 1), by = userID]
# or
# setDT(df)[, result := as.integer(length(unique(product)) > 1), by = userID]
df
#    userID product result
# 1:      1       a      0
# 2:      1       a      0
# 3:      1       a      0
# 4:      2       b      1
# 5:      2       b      1
# 6:      2       c      1
# 7:      3       a      1
# 8:      3       b      1
# 9:      3       c      1

或者

library(dplyr)
df %>%
  group_by(userID) %>%
  mutate(result = as.integer(n_distinct(product) > 1))
于 2014-10-15T10:22:55.097 回答
2

你可以ave使用base R

 df$result <- with(df, ave(as.character(product), userID, 
                 FUN=function(x) length(unique(x)))>1) +0 
 df$result
 [1] 0 0 0 1 1 1 1 1 1

或者按照@David Arenburg 的建议,您transform可以resultdf

  transform(df, result = (ave(as.character(product), 
          userID, FUN = function(x) length(unique(x)))>1)+0)

或者

tbl <- rowSums(!!table(df[,-3]))>1
(df$userID %in% names(tbl)[tbl])+0
 #[1] 0 0 0 1 1 1 1 1 1
于 2014-10-15T10:23:36.157 回答
2

您可以使用包data.tabledplyr解决这种拆分-应用-组合任务。这是您可以使用的方法data.table

library(data.table)
setDT(df)    ## convert to the new format
df[, result:=as.integer(length(unique(product)) > 1), by=userID]
于 2014-10-15T10:23:37.580 回答
1

这是我的:

# table of users x number_of_products
myTable <- table(userID, product)
# one line from there:
(result <- ifelse(rowSums(myTable!=0)==1, 0, 1)[userID])
1 1 1 2 2 2 3 3 3 
0 0 0 1 1 1 1 1 1
于 2014-10-15T10:46:25.390 回答