R 每个用户最常保留的大小

R 每个用户最常保留的大小,r,R,不幸的是,新的一个月给我带来了一些我无法独自解决的新问题——我想列出每个用户返回最多的大小[ReturnShipping=1]。当两个或两个以上的大小具有相同的发生率时,应写一个“-” 已经像这样尝试过了,但我一直在思考如何解决它;) (用户1:返回尺寸“m”一次,返回尺寸“xxl”一次 用户2:未返回任何项目 用户3:返回大小“42”一次) 数据: 这是我想到的 DB <- data.frame(orderID = c(1,2,3,4,5,6,7,8,9,10),

不幸的是,新的一个月给我带来了一些我无法独自解决的新问题——我想列出每个用户返回最多的大小[ReturnShipping=1]。当两个或两个以上的大小具有相同的发生率时,应写一个“-”

已经像这样尝试过了,但我一直在思考如何解决它;)

(用户1:返回尺寸“m”一次,返回尺寸“xxl”一次
用户2:未返回任何项目
用户3:返回大小“42”一次)

数据:


这是我想到的

DB <- data.frame(orderID  = c(1,2,3,4,5,6,7,8,9,10),     
                 orderDate = c("1.1.14","1.1.14","1.1.14","1.1.14","2.1.14", "2.1.14","2.1.14","2.1.14","2.1.14","2.1.14"),  
                 itemID = c(2,3,2,5,12,4,2,3,1,5),  
                 size = c("m", "l", 42, "xxl", "m", 42, 39, "m", "m", 44),
                 customerID = c(1, 2, 3, 1, 1, 3, 2, 2, 1, 1),
                 ItemReturned = c('No', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'No', 'No'))
theMost <- function(ID){
  df <- subset(DB, customerID==ID & ItemReturned=="No")
  tbl <- table(df$size)
  theMax <- max(tbl)
  theSizes <- names(tbl)[tbl==theMax]
  theSizes <- paste(theSizes, collapse="-")
  return(theSizes)
}
lapply(unique(DB$customerID), theMost)

DB这是我想到的

DB <- data.frame(orderID  = c(1,2,3,4,5,6,7,8,9,10),     
                 orderDate = c("1.1.14","1.1.14","1.1.14","1.1.14","2.1.14", "2.1.14","2.1.14","2.1.14","2.1.14","2.1.14"),  
                 itemID = c(2,3,2,5,12,4,2,3,1,5),  
                 size = c("m", "l", 42, "xxl", "m", 42, 39, "m", "m", 44),
                 customerID = c(1, 2, 3, 1, 1, 3, 2, 2, 1, 1),
                 ItemReturned = c('No', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'No', 'No'))
theMost <- function(ID){
  df <- subset(DB, customerID==ID & ItemReturned=="No")
  tbl <- table(df$size)
  theMax <- max(tbl)
  theSizes <- names(tbl)[tbl==theMax]
  theSizes <- paste(theSizes, collapse="-")
  return(theSizes)
}
lapply(unique(DB$customerID), theMost)

DB这是我想到的

DB <- data.frame(orderID  = c(1,2,3,4,5,6,7,8,9,10),     
                 orderDate = c("1.1.14","1.1.14","1.1.14","1.1.14","2.1.14", "2.1.14","2.1.14","2.1.14","2.1.14","2.1.14"),  
                 itemID = c(2,3,2,5,12,4,2,3,1,5),  
                 size = c("m", "l", 42, "xxl", "m", 42, 39, "m", "m", 44),
                 customerID = c(1, 2, 3, 1, 1, 3, 2, 2, 1, 1),
                 ItemReturned = c('No', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'No', 'No'))
theMost <- function(ID){
  df <- subset(DB, customerID==ID & ItemReturned=="No")
  tbl <- table(df$size)
  theMax <- max(tbl)
  theSizes <- names(tbl)[tbl==theMax]
  theSizes <- paste(theSizes, collapse="-")
  return(theSizes)
}
lapply(unique(DB$customerID), theMost)

DB这是我想到的

DB <- data.frame(orderID  = c(1,2,3,4,5,6,7,8,9,10),     
                 orderDate = c("1.1.14","1.1.14","1.1.14","1.1.14","2.1.14", "2.1.14","2.1.14","2.1.14","2.1.14","2.1.14"),  
                 itemID = c(2,3,2,5,12,4,2,3,1,5),  
                 size = c("m", "l", 42, "xxl", "m", 42, 39, "m", "m", 44),
                 customerID = c(1, 2, 3, 1, 1, 3, 2, 2, 1, 1),
                 ItemReturned = c('No', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'No', 'No'))
theMost <- function(ID){
  df <- subset(DB, customerID==ID & ItemReturned=="No")
  tbl <- table(df$size)
  theMax <- max(tbl)
  theSizes <- names(tbl)[tbl==theMax]
  theSizes <- paste(theSizes, collapse="-")
  return(theSizes)
}
lapply(unique(DB$customerID), theMost)
DB你可以试试

res <- unsplit( lapply(split(DB, DB$customerID), function(x) {
            tbl <- table(factor(x$size[x$ItemReturned=='No']))
            x$mostKeptsize <- if(sum(tbl==max(tbl))>1) '-' 
                     else names(which.max(tbl)); x}),
                    DB$customerID)
res$mostKeptsize
#[1] "m"  "-"  "42" "m"  "m"  "42" "-"  "-"  "m"  "m" 
res你可以试试

res <- unsplit( lapply(split(DB, DB$customerID), function(x) {
            tbl <- table(factor(x$size[x$ItemReturned=='No']))
            x$mostKeptsize <- if(sum(tbl==max(tbl))>1) '-' 
                     else names(which.max(tbl)); x}),
                    DB$customerID)
res$mostKeptsize
#[1] "m"  "-"  "42" "m"  "m"  "42" "-"  "-"  "m"  "m" 
res你可以试试

res <- unsplit( lapply(split(DB, DB$customerID), function(x) {
            tbl <- table(factor(x$size[x$ItemReturned=='No']))
            x$mostKeptsize <- if(sum(tbl==max(tbl))>1) '-' 
                     else names(which.max(tbl)); x}),
                    DB$customerID)
res$mostKeptsize
#[1] "m"  "-"  "42" "m"  "m"  "42" "-"  "-"  "m"  "m" 
res你可以试试

res <- unsplit( lapply(split(DB, DB$customerID), function(x) {
            tbl <- table(factor(x$size[x$ItemReturned=='No']))
            x$mostKeptsize <- if(sum(tbl==max(tbl))>1) '-' 
                     else names(which.max(tbl)); x}),
                    DB$customerID)
res$mostKeptsize
#[1] "m"  "-"  "42" "m"  "m"  "42" "-"  "-"  "m"  "m" 

res我使用了
dplyr
试图让代码更具可读性。函数getMostFrequent首先剥离返回的项,然后按大小变量分组,获取每个项的计数,生成一个新列,计算该大小是否为最大值,只过滤到这些行,并只保留大小变量。然后检查-如果有多行,则返回“-”,否则返回最频繁的大小作为字符(以便将来更容易进行其他操作)

现在-如何应用:我首先使用了split(),它将原始数据转换成一个列表,每个customerID对应一个列表。这样做的优点是使用userID命名的元素-顺序并不重要。我使用lappy将函数应用于列表的每个元素,该元素返回一个包含命名元素的列表。然后,我将其提取到一个带有customerID和最常见大小的data.frame中。如果您真的希望它是一个与原始向量匹配的向量,您可以对变量进行一些重铸,并在
dplyr
中进行
left\u join

library(dplyr)

getMostFrequent = function(x) {
  data = x %>%
    filter(ItemReturned == "No") %>%
    group_by(size) %>%
    summarise(Count = n()) %>%
    mutate(mostFrequent = ifelse(Count==max(Count),1,0)) %>%
    filter(mostFrequent == 1) %>%
    select(size)
  if(nrow(data) > 1){
    return("-")
  } else {
    return(as.character(data$size))
  }
}

j = lapply(with(DB,split(DB,customerID)),getMostFrequent)
data.frame(customerID = names(j),mostCommonSize=unlist(j))

  customerID mostCommonSize
1          1              m
2          2              -
3          3             42

我使用了
dplyr
试图让代码更具可读性。函数getMostFrequent首先剥离返回的项,然后按大小变量分组,获取每个项的计数,生成一个新列,计算该大小是否为最大值,只过滤到这些行,并只保留大小变量。然后检查-如果有多行,则返回“-”,否则返回最频繁的大小作为字符(以便将来更容易进行其他操作)

现在-如何应用:我首先使用了split(),它将原始数据转换成一个列表,每个customerID对应一个列表。这样做的优点是使用userID命名的元素-顺序并不重要。我使用lappy将函数应用于列表的每个元素,该元素返回一个包含命名元素的列表。然后,我将其提取到一个带有customerID和最常见大小的data.frame中。如果您真的希望它是一个与原始向量匹配的向量,您可以对变量进行一些重铸,并在
dplyr
中进行
left\u join

library(dplyr)

getMostFrequent = function(x) {
  data = x %>%
    filter(ItemReturned == "No") %>%
    group_by(size) %>%
    summarise(Count = n()) %>%
    mutate(mostFrequent = ifelse(Count==max(Count),1,0)) %>%
    filter(mostFrequent == 1) %>%
    select(size)
  if(nrow(data) > 1){
    return("-")
  } else {
    return(as.character(data$size))
  }
}

j = lapply(with(DB,split(DB,customerID)),getMostFrequent)
data.frame(customerID = names(j),mostCommonSize=unlist(j))

  customerID mostCommonSize
1          1              m
2          2              -
3          3             42

我使用了
dplyr
试图让代码更具可读性。函数getMostFrequent首先剥离返回的项,然后按大小变量分组,获取每个项的计数,生成一个新列,计算该大小是否为最大值,只过滤到这些行,并只保留大小变量。然后检查-如果有多行,则返回“-”,否则返回最频繁的大小作为字符(以便将来更容易进行其他操作)

现在-如何应用:我首先使用了split(),它将原始数据转换成一个列表,每个customerID对应一个列表。这样做的优点是使用userID命名的元素-顺序并不重要。我使用lappy将函数应用于列表的每个元素,该元素返回一个包含命名元素的列表。然后,我将其提取到一个带有customerID和最常见大小的data.frame中。如果您真的希望它是一个与原始向量匹配的向量,您可以对变量进行一些重铸,并在
dplyr
中进行
left\u join

library(dplyr)

getMostFrequent = function(x) {
  data = x %>%
    filter(ItemReturned == "No") %>%
    group_by(size) %>%
    summarise(Count = n()) %>%
    mutate(mostFrequent = ifelse(Count==max(Count),1,0)) %>%
    filter(mostFrequent == 1) %>%
    select(size)
  if(nrow(data) > 1){
    return("-")
  } else {
    return(as.character(data$size))
  }
}

j = lapply(with(DB,split(DB,customerID)),getMostFrequent)
data.frame(customerID = names(j),mostCommonSize=unlist(j))

  customerID mostCommonSize
1          1              m
2          2              -
3          3             42

我使用了
dplyr
试图让代码更具可读性。函数getMostFrequent首先剥离返回的项,然后按大小变量分组,获取每个项的计数,生成一个新列,计算该大小是否为最大值,只过滤到这些行,并只保留大小变量。然后检查-如果有多行,则返回“-”,否则返回最频繁的大小作为字符(以便将来更容易进行其他操作)

现在-如何应用:我首先使用了split(),它将原始数据转换成一个列表,每个customerID对应一个列表。这样做的优点是使用userID命名的元素-顺序并不重要。我使用lappy将函数应用于列表的每个元素,该元素返回一个包含命名元素的列表。然后,我将其提取到一个带有customerID和最常见大小的data.frame中。如果您真的希望它是一个与原始向量匹配的向量,您可以对变量进行一些重铸,并在
dplyr
中进行
left\u join

library(dplyr)

getMostFrequent = function(x) {
  data = x %>%
    filter(ItemReturned == "No") %>%
    group_by(size) %>%
    summarise(Count = n()) %>%
    mutate(mostFrequent = ifelse(Count==max(Count),1,0)) %>%
    filter(mostFrequent == 1) %>%
    select(size)
  if(nrow(data) > 1){
    return("-")
  } else {
    return(as.character(data$size))
  }
}

j = lapply(with(DB,split(DB,customerID)),getMostFrequent)
data.frame(customerID = names(j),mostCommonSize=unlist(j))

  customerID mostCommonSize
1          1              m
2          2              -
3          3             42

我对这些编辑感到有点困惑,但您所描述的似乎是通过原始答案中的以下修改实现的:

DB[["customerID"]] = factor(DB[["customerID"]]) #I guess it should be a factor    
tab = table(DB[DB$ItemReturned == "Yes", c("customerID", "size")])
maxes = max.col(tab, "first")
ans = ifelse(rowSums(tab == tab[cbind(seq_len(nrow(tab)), maxes)]) > 1, 
             "-", 
             colnames(tab)[maxes])
ans[rowSums(tab) == 0] = "retained all items"
unname(ans[DB$customerID])
#[1] "-"                  "retained all items" "42"                
# [4] "-"                  "-"                  "42"                
# [7] "retained all items" "retained all items" "-"                 
#[10] "-"

我对这些编辑感到有点困惑,但您所描述的似乎是通过原始答案中的以下修改实现的:

DB[["customerID"]] = factor(DB[["customerID"]]) #I guess it should be a factor    
tab = table(DB[DB$ItemReturned == "Yes", c("customerID", "size")])
maxes = max.col(tab, "first")
ans = ifelse(rowSums(tab == tab[cbind(seq_len(nrow(tab)), maxes)]) > 1, 
             "-", 
             colnames(tab)[maxes])
ans[rowSums(tab) == 0] = "retained all items"
unname(ans[DB$customerID])
#[1] "-"                  "retained all items" "42"                
# [4] "-"                  "-"                  "42"                
# [7] "retained all items" "retained all items" "-"                 
#[10] "-"

我对这些编辑感到有点困惑,但您所描述的似乎是通过原始答案中的以下修改实现的:

DB[["customerID"]] = factor(DB[["customerID"]]) #I guess it should be a factor    
tab = table(DB[DB$ItemReturned == "Yes", c("customerID", "size")])
maxes = max.col(tab, "first")
ans = ifelse(rowSums(tab == tab[cbind(seq_len(nrow(tab)), maxes)]) > 1, 
             "-", 
             colnames(tab)[maxes])
ans[rowSums(tab) == 0] = "retained all items"
unname(ans[DB$customerID])
#[1] "-"                  "retained all items" "42"                
# [4] "-"                  "-"                  "42"                
# [7] "retained all items" "retained all items" "-"                 
#[10] "-"

我对这些编辑感到有点困惑,但您所描述的似乎是通过原始答案中的以下修改实现的:

DB[["customerID"]] = factor(DB[["customerID"]]) #I guess it should be a factor    
tab = table(DB[DB$ItemReturned == "Yes", c("customerID", "size")])
maxes = max.col(tab, "first")
ans = ifelse(rowSums(tab == tab[cbind(seq_len(nrow(tab)), maxes)]) > 1, 
             "-", 
             colnames(tab)[maxes])
ans[rowSums(tab) == 0] = "retained all items"
unname(ans[DB$customerID])
#[1] "-"                  "retained all items" "42"                
# [4] "-"                  "-"                  "42"                
# [7] "retained all items" "retained all items" "-"                 
#[10] "-"

这将返回第二个元素的
“l-m”
,而不是
“-”
我真的不了解结果-如何将其集成到现有数据集?这将返回第二个元素的
“l-m”
,而不是
“-”
我真的不理解结果-我如何将其集成到现有的数据集?这将返回sec的
“l-m”