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@Parseltongue
partner\u值是
系数还是
字符
?但是,不管怎样,我的解决方案越来越长,你已经收到了@camille提供的一个很好的解决方案。感谢您的支持。使用TrxID分组似乎比使用seq_/2更简单。此外,您还可以使用ave而不是split-Lappy unlist:
dat$partner\u value=with(dat,ave(Quant,TrxID,FUN=rev))
这是一个很好的建议。谢谢,哇。这也是最简单的方法。非常感谢。