gpt4 book ai didi

r - 将变量组合成一个列表

转载 作者:行者123 更新时间:2023-12-04 09:06:48 24 4
gpt4 key购买 nike

伙计们,

我被以下挑战难住了。我有一个如下所示的数据集:

BuyerID    Fruit.1     Fruit.2    Fruit.3    Amount.1    Amount.2    Amount.3
879 Banana Apple 4 3
765 Strawberry Apple Orange 1 2 4
123 Orange Banana 1 1 1
11 Strawberry 3
773 Kiwi Banana 1 2

我想做的是简化数据(如果可能的话)并折叠“水果”和“金额”变量
BuyerID    Fruit                             Amount      Total    Count
879 "Banana" "Apple" 4 3 7 2
765 "Strawberry" "Apple" "Orange" 1 2 4 7 3
123 "Orange" "Banana" 1 1 1 3 2
11 "Strawberry" 3 3 1
773 "Kiwi" "Banana" 1 2 3 2

我尝试过使用 c() 和 rbind() 但它们没有产生我想要的结果 - 我在这里尝试了提示: data.frame rows to a list也是,但我不太确定这是否是简化我的数据的最佳方式。

这样一来,我可能更容易处理更少的变量来计算某些项目的出现(例如,60% 的买家购买香蕉)。

我希望这是可行的——我也愿意接受任何建议。任何解决方案表示赞赏!

谢谢你。

最佳答案

尝试复制您的数据,并使用 data.table

DT  <- data.frame(
BuyerID = c(879,765,123,11,773),
Fruit.1 = c('Banana','Strawberry','Orange','Strawberry','Kiwi'),
Fruit.2 = c('Apple','Apple','Banana',NA,'Banana'),
Fruit.3 = c( NA, 'Orange',NA,NA,NA),
Amount.1 = c(4,1,1,3,1), Amount.2 = c(3,2,1,NA,2), Amount.3 = c(NA,4,1,NA,NA),
Total = c(7,7,3,3,3),
Count = c(2,3,2,1,2),
stringsAsFactors = FALSE)

# reshaping to long form and data.table

library(data.table)
DTlong <- data.table(reshape(DT, varying = list(Fruit = 2:4, Amount = 5:7),
direction = 'long'))

# create lists (without NA values)
# also adding count and total columns
# by using <- to save Fruit and Amount for later use

DTlist <- DTlong[, list(Fruit <- list(as.vector(na.omit(Fruit.1))),
Amount <- list(as.vector(na.omit(Amount.1))),
Count = length(unlist(Fruit)),
Total = sum(unlist(Amount))),
by = BuyerID]

BuyerID V1 V2 Count Total
1: 879 Banana,Apple 4,3 2 7
2: 765 Strawberry,Apple,Orange 1,2,4 3 7
3: 123 Orange,Banana 1,1,1 2 3
4: 11 Strawberry 3 1 3
5: 773 Kiwi,Banana 1,2 2 3

@RicardoSaporta 编辑:

如果您愿意,可以使用 list(list(c(....))) 跳过 reshape 步骤。
这可能会节省相当多的执行时间(缺点是它添加了 NA而不是空格)。但是,正如@Marius 指出的那样, DTlong以上可能更容易使用。
DT <- data.table(DT)
DT[, Fruit := list(list(c( Fruit.1, Fruit.2, Fruit.3))), by=BuyerID]
DT[, Ammount := list(list(c(Amount.1, Amount.2, Amount.3))), by=BuyerID]

# Or as a single line
DT[, list( Fruit = list(c( Fruit.1, Fruit.2, Fruit.3)),
Ammount = list(c(Amount.1, Amount.2, Amount.3)),
Total, Count), # other columns used
by = BuyerID]

关于r - 将变量组合成一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15237995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com