基于共享组值的系数新列[R]

基于共享组值的系数新列[R],r,dplyr,R,Dplyr,假设我有以下数据。我感兴趣的是创建一个新的因素列,以捕获Item_I、Item_j和/或Item_k是否对每个类别a、B、C、D等编码为“1” dat <- data.frame(c("A","A","B","B","C","C","D","D"), c("x","y","y","z","x","z","y","z"), c(1,0,0,1,1,0,0,0), c(0,1,1,0,0,0,1,0), c(0,0,0,1,0,1,0,1)) names(dat) <- c("Categ

假设我有以下数据。我感兴趣的是创建一个新的因素列,以捕获
Item_I
Item_j
和/或
Item_k
是否对每个类别a、B、C、D等编码为“1”

dat <- data.frame(c("A","A","B","B","C","C","D","D"), c("x","y","y","z","x","z","y","z"), c(1,0,0,1,1,0,0,0), c(0,1,1,0,0,0,1,0), c(0,0,0,1,0,1,0,1))
names(dat) <- c("Categories","Aspects","Item_i", "Item_j", "Item_k")
但我真正想要的是
dat$FactorCol
反映I、j、k或某些组合是否出现在每个类别中的任何位置,然后返回一个新列(具有相同的行数)

输出类似于:

  Categories Aspects Item_i Item_j Item_k FactorCol
1          A     x      1      0      0         i and j
2          A     y      0      1      0         i and j
3          B     y      0      1      0         i and j and k
4          B     z      1      0      1         i and j and k
5          C     x      1      0      0         i and k
6          C     z      0      0      1         i and k
7          D     y      0      1      0         j and k
8          D     z      0      0      1         j and k

在我的数据中,分类也不是每两行整齐地重新启动一次。我猜
dplyr()
可以很容易地处理这个问题,但我自己无法做到。感谢任何提示。

对于每个
类别
,我们可以获得
项目
列的
最大
值,对于我们在每行中分配
i
j
k
值的列。为了获得相同数量的行,我们使用
dat
left\u连接

library(dplyr)
cols <- c('i', 'j', 'k')

dat %>%
  group_by(Categories) %>%
  summarise(across(starts_with('Item_'), max)) %>%
  #In old dplyr
  #summarise_at(vars(starts_with('Item_')), max)
  mutate(FactorCol = purrr::pmap_chr(select(., starts_with('Item_')), 
                          ~toString(cols[c(...) == 1]))) %>%
  select(Categories, FactorCol) %>%
  left_join(dat, by = 'Categories')


#  Categories FactorCol Items Item_i Item_j Item_k
#  <chr>      <chr>     <chr>  <dbl>  <dbl>  <dbl>
#1 A          i, j      x          1      0      0
#2 A          i, j      y          0      1      0
#3 B          i, j, k   y          0      1      0
#4 B          i, j, k   z          1      0      1
#5 C          i, k      x          1      0      0
#6 C          i, k      z          0      0      1
#7 D          j, k      y          0      1      0
#8 D          j, k      z          0      0      1
库(dplyr)
科尔斯%
按(类别)分组%>%
总结(跨越(以('Item')开头,最大值))%>%
#在旧dplyr中
#总结(变量(以('Item')开头),最大值)
突变(FactorCol=purrr::pmap_chr(选择(,以('Item_uu'))开头),
~toString(cols[c(…)==1]))%>%
选择(类别、工厂成本)%>%
左联合(dat,by='Categories')
#类别工厂存货项目项目_i项目_j项目_k
#                   
#1ai,jx100
#2 A i,j y 0 1 0
#3b i,j,k y 0 1 0
#4BI,j,KZ101
#5ci,kx100
#6ci,kz01
#7dj,ky0110
#8dj,kz01

对于每个
类别
,我们可以获得
列的
最大值
值,对于我们在每行分配
i
j
k
值的列。为了获得相同数量的行,我们使用
dat
left\u连接

library(dplyr)
cols <- c('i', 'j', 'k')

dat %>%
  group_by(Categories) %>%
  summarise(across(starts_with('Item_'), max)) %>%
  #In old dplyr
  #summarise_at(vars(starts_with('Item_')), max)
  mutate(FactorCol = purrr::pmap_chr(select(., starts_with('Item_')), 
                          ~toString(cols[c(...) == 1]))) %>%
  select(Categories, FactorCol) %>%
  left_join(dat, by = 'Categories')


#  Categories FactorCol Items Item_i Item_j Item_k
#  <chr>      <chr>     <chr>  <dbl>  <dbl>  <dbl>
#1 A          i, j      x          1      0      0
#2 A          i, j      y          0      1      0
#3 B          i, j, k   y          0      1      0
#4 B          i, j, k   z          1      0      1
#5 C          i, k      x          1      0      0
#6 C          i, k      z          0      0      1
#7 D          j, k      y          0      1      0
#8 D          j, k      z          0      0      1
库(dplyr)
科尔斯%
按(类别)分组%>%
总结(跨越(以('Item')开头,最大值))%>%
#在旧dplyr中
#总结(变量(以('Item')开头),最大值)
突变(FactorCol=purrr::pmap_chr(选择(,以('Item_uu'))开头),
~toString(cols[c(…)==1]))%>%
选择(类别、工厂成本)%>%
左联合(dat,by='Categories')
#类别工厂存货项目项目_i项目_j项目_k
#                   
#1ai,jx100
#2 A i,j y 0 1 0
#3b i,j,k y 0 1 0
#4BI,j,KZ101
#5ci,kx100
#6ci,kz01
#7dj,ky0110
#8dj,kz01

即使加载了dplyr()和purrr(),这也会为我抛出一个错误:Cross中的错误(以(“Item”),max开始):找不到函数“Cross”
Cross
是新的
dplyr
。如果没有1.0.0,请使用
在(变量(以('Item_uu')开头)、max)处总结。我在最初的回答中已经把它作为一个评论。这是一个很酷的解决方案,尽管我还不能完全理解,还需要进一步的研究来理解它的工作原理。只有一个问题:对于任何NA类别,它都返回
i,j,k
。您如何让它返回NA intead?我认为如果您在
max
中添加
NA.rm=TRUE
,它应该会修复它<代码>总结(变量(以('Item'))开头),max,na.rm=TRUE)
不幸的是,这并不能解决问题。它很容易通过另一个操作修复。我只是担心引擎盖下面有什么不对劲。看起来还可以用,否则的话!感谢您的帮助,即使加载了dplyr()和purrr(),这也会为我抛出一个错误:Cross中的错误(以(“Item”),max开头):找不到函数“Cross”
Cross
是新的
dplyr
。如果没有1.0.0,请使用
在(变量(以('Item_uu')开头)、max)处总结。我在最初的回答中已经把它作为一个评论。这是一个很酷的解决方案,尽管我还不能完全理解,还需要进一步的研究来理解它的工作原理。只有一个问题:对于任何NA类别,它都返回
i,j,k
。您如何让它返回NA intead?我认为如果您在
max
中添加
NA.rm=TRUE
,它应该会修复它<代码>总结(变量(以('Item'))开头),max,na.rm=TRUE)
不幸的是,这并不能解决问题。它很容易通过另一个操作修复。我只是担心引擎盖下面有什么不对劲。看起来还可以用,否则的话!谢谢你的帮助