我有一个字符变量,它有从0到5的数字存储在它不同的长度。我想创建5个虚拟变量,显示如果数字(0到5)存在于给定的行。我能够实现这一点:
library(data.table)
dataset <-
data.table(
'char' = c('1 2 3 0', '1 5 0', '1 2 0', '1 0', '1 2 4 0')
)
for(i in c(0:5)){
dataset[grepl(i, char), c(paste0('Idx_', i)) := 1]
}
导致:
char Idx_0 Idx_1 Idx_2 Idx_3 Idx_4 Idx_5
1: 1 2 3 0 1 1 1 1 NA NA
2: 1 5 0 1 1 NA NA NA 1
3: 1 2 0 1 1 1 NA NA NA
4: 1 0 1 1 NA NA NA NA
5: 1 2 4 0 1 1 1 NA 1 NA
由于我的数据集相当大,我知道这通常是一个好主意,以避免for循环,我很好奇,如果它可以做到这一点没有一个for循环。我尝试了周围的组合.SD,应用和“by = 1:nrow(dataset)",但没有它为我工作..
5条答案
按热度按时间vbopmzt11#
我建议你修改一下你目前的方法,稍微快一点(因为循环在R中并不总是坏的):
另一种选择:
s4chpxco2#
这将是功能方法:
rjzwgtxy3#
如果我们有数字而不是数字,grepl 将以同样的方式匹配1和11。为了避免这种情况,我们可以在空格上分割(tstrsplit),重塑宽到长(melt),然后用 fun.aggregate 重塑它回到长到宽(dcast),参见示例:
ubof19bj4#
这是一个
Base R
的解决方案,如果你的data.frame
非常大,你可以使用parallel和parallel::parlapply
包来代替外部的lapply。0yg35tkg5#
一个Tidyverse的方法只是为了记录(不试图在这里的速度方面竞争...):
创建于2023-04-13带有reprex v2.0.2