R 每个用户最常保留的大小
不幸的是,新的一个月给我带来了一些我无法独自解决的新问题——我想列出每个用户返回最多的大小[ReturnShipping=1]。当两个或两个以上的大小具有相同的发生率时,应写一个“-” 已经像这样尝试过了,但我一直在思考如何解决它;) (用户1:返回尺寸“m”一次,返回尺寸“xxl”一次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),
用户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”