gpt4 book ai didi

r - 改变每一个可能的列组合

转载 作者:行者123 更新时间:2023-12-04 11:12:27 25 4
gpt4 key购买 nike

我有一个二进制变量的数据框:

df <-data.frame(a = c(0,1,0,1,0), b = c(1, 1, 0, 0, 1), c = c(1,0,1,1,0))

我想为我预先存在的列的每个可能组合创建一个列:

library(tidyverse)
df %>%
mutate(d = case_when(a==1 & b==1 & c==1 ~ 1),
e = case_when(a==1 & b==1 & c!=1 ~ 1),
f = case_when(a==1 & b!=1 & c==1 ~ 1),
g = case_when(a!=1 & b==1 & c==1 ~ 1))

但我的真实数据集有太多列,无法在没有函数或循环的情况下执行此操作。在 R 中有一种简单的方法可以做到这一点吗?

最佳答案

首先请注意,do.call(paste0, df) 会将您的所有列组合成一个字符串,无论它们有多少:

do.call(paste0, df)
# [1] "011" "110" "001" "101" "010" "011"

然后您可以使用 tidyr 包中的 spread() 为每个列提供自己的列。请注意,您必须添加一个额外的 row 列,以便它知道将每一行分开(而不是尝试将它们组合起来)。

# I added a sixth row that copied the first to make the effect clear
df<-data.frame(a = c(0,1,0,1,0,0), b = c(1, 1, 0, 0, 1, 1), c = c(1,0,1,1,0,1))

# this assumes you want `type_` at the start of each new column,
# but you could use a different convention
df %>%
mutate(type = paste0("type_", do.call(paste0, df)),
value = 1,
row = row_number()) %>%
spread(type, value, fill = 0) %>%
select(-row)

结果:

  a b c type_001 type_010 type_011 type_101 type_110
1 0 0 1 1 0 0 0 0
2 0 1 0 0 1 0 0 0
3 0 1 1 0 0 1 0 0
4 0 1 1 0 0 1 0 0
5 1 0 1 0 0 0 1 0
6 1 1 0 0 0 0 0 1

关于r - 改变每一个可能的列组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48818699/

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