r语言 - 将数千个虚拟变量转换为多项式变量



我有一个以下类型的数据帧:

a<-c('q','w')
b<-c(T,T)
d<-c(F,F)
.e<-c(T,F)
.f<-c(F,F)
.g<-c(F,T)
h<-c(F,F)
i<-c(F,T)
j<-c(T,T)

df<-data.frame(a,b,d,.e,.f,.g,h,i,j)
a    b     d    .e    .f    .g     h     i    j
1 q TRUE FALSE  TRUE FALSE FALSE FALSE FALSE TRUE
2 w TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE TRUE

我想将所有以开头的句点开头的变量转换为一个名为 Index 的单个多项式变量,这样第二行将具有 Index 列的值1,第三行将具有值2,依此类推:

df$Index<-c('e','g')
a    b     d    .e    .f    .g     h     i    j Index
1 q TRUE FALSE  TRUE FALSE FALSE FALSE FALSE TRUE     e
2 w TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE TRUE     g

尽管许多行可以对任何周期初始变量进行T,但每行只能为一个周期初始变量T

如果只是几个项目 id 做一个ifelse语句:

df$Index <- ifelse(df$_10000, '10000',...

但是有12000个这样的。所有虚拟变量的名称都以下划线开头,所以我觉得一定有更好的方法。在伪代码中,我会说这样的话:

for every row:
for every column beginning with '_':
if value == T:
assign the name of the column without '_' to a Column 'Index'

提前致谢

示例数据:

df <- cbind(a = letters[1:10], b = LETTERS[1:10],
data.frame(diag(10) == 1))
names(df)[-(1:2)] <- paste0("_", 1:10)
set.seed(42)
df <- df[sample(nrow(df)),]
head(df,3)
#    a b    _1    _2    _3    _4    _5    _6    _7    _8    _9   _10
# 1  a A  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 5  e E FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
# 10 j J FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

执行:

df$Index <- apply(subset(df, select = grepl("^_", names(df))), 1, 
function(z) which(z)[1])
df
#    a b    _1    _2    _3    _4    _5    _6    _7    _8    _9   _10 Index
# 1  a A  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE     1
# 5  e E FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE     5
# 10 j J FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE    10
# 8  h H FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE     8
# 2  b B FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE     2
# 4  d D FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE     4
# 6  f F FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE     6
# 9  i I FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE     9
# 7  g G FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE     7
# 3  c C FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE     3

如果一行_列中有多个TRUE,则将使用找到的第一个,其余的静默忽略。如果没有,则将Index该行NA

最新更新