R:获取ID对,并获取该对中另一项的特定列的值
假设我有以下数据帧:R:获取ID对,并获取该对中另一项的特定列的值,r,R,假设我有以下数据帧: dat <- read.table(text="TrxID Items Quant Trx1 A Yes Trx1 B Maybe Trx2 E No Trx2 B Yes Trx3 B Definitely Trx3 C Yes Trx5 F No Trx5 D Maybe", header=T) 做这件事的正确方法是什么 类似这样: library(tidyverse) dat %>% group_by(TrxID) %>% muta
dat <- read.table(text="TrxID Items Quant
Trx1 A Yes
Trx1 B Maybe
Trx2 E No
Trx2 B Yes
Trx3 B Definitely
Trx3 C Yes
Trx5 F No
Trx5 D Maybe", header=T)
做这件事的正确方法是什么 类似这样:
library(tidyverse)
dat %>%
group_by(TrxID) %>%
mutate(partner_value = sum(Quant) ) %>%
mutate(partner_value =partner_value-Quant )
因此,结果是:
TrxID Items Quant partner_value
<fct> <fct> <int> <int>
1 Trx1 A 3 1
2 Trx1 B 1 3
3 Trx2 E 3 1
4 Trx2 B 1 3
5 Trx3 B 1 4
6 Trx3 C 4 1
7 Trx5 F 5 1
8 Trx5 D 1 5
TrxID项目数量伙伴值
1 Trx1 A 3 1
2 Trx1 B 1 3
3 Trx2 E 3 1
4 Trx2 B 1 3
5 Trx3 B 1 4
6 Trx3 C4 1
7 Trx5 F 5 1
8 Trx5 D 1 5
这样就行了<代码>拆分按TrxID分组的变量Quant。使用rev
在各组内颠倒顺序。由于使用了lappy
,因此我们还需要在末尾取消列出。所有基本R
dat$partner_value <- unlist(lapply(split(dat$Quant, ceiling(seq_along(1:nrow(dat))/2)), rev))
TrxID Items Quant partner_value
1 Trx1 A Yes Maybe
2 Trx1 B Maybe Yes
3 Trx2 E No Yes
4 Trx2 B Yes No
5 Trx3 B Definitely Yes
6 Trx3 C Yes Definitely
7 Trx5 F No Maybe
8 Trx5 D Maybe No
dat$partner\u value这有点迂回,但您可以将数据与其自身的修改版本连接起来,然后过滤合作观察结果。它在一个dplyr
管道中工作,或者您可以将其分解为多个部分
我要做的是内联复制数据帧,其中只有ID和标记为partner\u值的Quant
列。如果我将其隔离或保存到变量中,则如下所示:
library(tidyverse)
dat %>%
group_by(TrxID) %>%
mutate(partner_value = sum(Quant) ) %>%
mutate(partner_value =partner_value-Quant )
库(tidyverse)
dat%>%选择(TrxID,partner\u value=Quant)
#>TrxID伙伴值
#>1 Trx1是
#>可能是2 Trx1
#>3 Trx2号
#>4 Trx2是
#>5 Trx3绝对
#>6 Trx3是
#>7 Trx5号
#>可能是8 Trx5
相反,我在我的internal\u join
调用中这样做,通过ID加入。然后我过滤它,只保留Quant
和partner\u value
不同的观察值,也就是说,观察值本身与其合作伙伴加入
dat%>%
内部联接(dat%>%select(TrxID,伙伴值=Quant),by=c(“TrxID”))%>%
过滤器(数量!=合作伙伴值)
#>TrxID项目数量伙伴值
#>1 Trx1 A是的,也许
#>可能是的
#>3 Trx2 E否是
#>4 Trx2 B是否
#>5 Trx3 B绝对是的
#>6 Trx3 C是的,当然
#>7 Trx5 F不可能
#>8 Trx5 D可能没有
使用基数R:您可以使用rev
反转向量的顺序:
transform(dat,partner_value=ave(Quant,TrxID,FUN=rev))
TrxID Items Quant partner_value
1 Trx1 A Yes Maybe
2 Trx1 B Maybe Yes
3 Trx2 E No Yes
4 Trx2 B Yes No
5 Trx3 B Definitely Yes
6 Trx3 C Yes Definitely
7 Trx5 F No Maybe
8 Trx5 D Maybe No
基于萨尔曼的回应
dat %>%
mutate(Quant=factor(Quant)) %>%
mutate(quant_factor= as.integer(dat$Quant)) %>%
group_by(TrxID) %>%
mutate(partner_value = sum(quant_factor) ) %>%
mutate(partner_value =partner_value-quant_factor ) %>%
mutate(partner_value= levels(Quant)[partner_value]) %>%
select(-c(quant_factor))
输出如下
TrxID Items Quant partner_value
<fct> <fct> <fct> <chr>
1 Trx1 A Yes Maybe
2 Trx1 B Maybe Yes
3 Trx2 E No Yes
4 Trx2 B Yes No
5 Trx3 B Definitely Yes
6 Trx3 C Yes Definitely
7 Trx5 F No Maybe
8 Trx5 D Maybe No
TrxID项目数量伙伴值
1 Trx1 A是的,也许
可能是的
3 Trx2 E否是
4 Trx2 B是否
5 Trx3 B绝对是的
6 Trx3 C是的,当然
7 Trx5 F不可能
8 Trx5 D可能没有
这是一个非常聪明的解决方案,但在实际数据集中,Quant是一个char变量,而不是一个数字。对不起,没有具体说明!对此有何想法?我会更新我的question@Parseltonguepartner\u值是系数还是字符
?但是,不管怎样,我的解决方案越来越长,你已经收到了@camille提供的一个很好的解决方案。感谢您的支持。使用TrxID分组似乎比使用seq_/2更简单。此外,您还可以使用ave而不是split-Lappy unlist:dat$partner\u value=with(dat,ave(Quant,TrxID,FUN=rev))
这是一个很好的建议。谢谢,哇。这也是最简单的方法。非常感谢。