R 在一系列列中循环选择数据子集以生成新变量

R 在一系列列中循环选择数据子集以生成新变量,r,for-loop,apply,R,For Loop,Apply,我试图找到一种最佳方法来生成一系列1/0编码列,这取决于在包含多个值的字符串中是否出现特定值 我有一个数据列skin_problems,它包含1到n个以字符形式存储的值 "1" "6" "6 12" 值的范围为1到n,即如果最大值为10,则该列也可能包含1 2 3 4 5 6 7 8 9 10 这些是数据收集的输出,用户可以选择多类型选项;i、 e他们有一个选项列表,并勾选所有适用的选项。 因此,如果他们选择1,则列仅包含1,如果他们选择6&12,则列包含6 12 然后,我尝试根据本专栏中的值

我试图找到一种最佳方法来生成一系列1/0编码列,这取决于在包含多个值的字符串中是否出现特定值

我有一个数据列skin_problems,它包含1到n个以字符形式存储的值

"1"
"6"
"6 12"
值的范围为1到n,即如果最大值为10,则该列也可能包含1 2 3 4 5 6 7 8 9 10

这些是数据收集的输出,用户可以选择多类型选项;i、 e他们有一个选项列表,并勾选所有适用的选项。 因此,如果他们选择1,则列仅包含1,如果他们选择6&12,则列包含6 12

然后,我尝试根据本专栏中的值生成一些新变量。i、 e基本上是根据用户选择的内容生成1/0值

例如,如果任何条目为3,则new var3=1 所以

在本例中,第2行、第3行和第5行都是正确的,对于这些行,newvar3的值应设置为1

我认为最简单的方法是使用单独的

cases_per_house <- separate(cases_per_house,into = c("p1","p2","p3","p4","p5","p6","p7","p8","p9","p10","p11","p12","p13"),skin_problem,sep=" ")
我尝试过使用apply和for循环的方法,但没有什么乐趣。 起初,我还尝试在原始列上使用grep,但没有使用separate,但无法实现,因为由于列中的数字可能会按顺序和数量变化,因此很难找到正则表达式


希望这是清楚的-请让我知道我能做些什么来澄清/改进问题

将值匹配函数应用于分离的数据,1表示匹配,0表示不匹配,然后将列附加到原始数据帧,如下所示:

text<-data.frame(sel=c("1","6","6 12","1","2 3","3","12 13","4 3"))
library(tidyr)
text<-separate(text, 1, c("p1","p2","p3","p4","p5","p6","p7","p8","p9","p10","p11","p12","p13"))

for(i in 1:13){
sel<-as.data.frame(apply(text, 1, function(x) as.integer(i %in% x)))
names(sel) <- paste0("sel", i)
text <- cbind(text,sel)
}

只需添加理想的tidyverse或base R方法,因为这些是我最熟悉的工具套件
cases_per_house$ulcer[cases_per_house$p1==1] <-1
cases_per_house$lump[cases_per_house$p1==2] <-1
ulcer = 1 if p1 = 1 
lump = 1 if p1 = 2
ulcer = 1 if p2 = 1
lump = 1 if p2 = 2
text<-data.frame(sel=c("1","6","6 12","1","2 3","3","12 13","4 3"))
library(tidyr)
text<-separate(text, 1, c("p1","p2","p3","p4","p5","p6","p7","p8","p9","p10","p11","p12","p13"))

for(i in 1:13){
sel<-as.data.frame(apply(text, 1, function(x) as.integer(i %in% x)))
names(sel) <- paste0("sel", i)
text <- cbind(text,sel)
}