基于共享组值的系数新列[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
值的列。为了获得相同数量的行,我们使用datleft\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
值的列。为了获得相同数量的行,我们使用datleft\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)
不幸的是,这并不能解决问题。它很容易通过另一个操作修复。我只是担心引擎盖下面有什么不对劲。看起来还可以用,否则的话!谢谢你的帮助