我试图找到生成一系列1/0编码列的最佳方法,具体取决于在包含多个值的字符串中是否出现特定值。
我有一个数据列(skin_problems),其中包含1到n个存储为字符的值
"1"
"6"
"6 12"
值范围从1到n(即如果最大值为10,则列也可以包含“1 2 3 4 5 6 7 8 9 10”
这些是来自数据收集的输出,其中用户具有select_multiple类型选项;他们有一个选项列表,并勾选所有适用的选项。
因此,如果他们选择1,则该列仅包含"1"
,如果他们选择6&该列包含"6 12"
我正在尝试根据此列中的值生成一些新变量。即基本上根据用户选择的内容生成1/0值。
例如,如果任何条目为3,则新var3 = 1 所以
"1"
"2 3"
"3"
"12 13"
"4 3"
在这个例子中,第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=" ")
我知道最大值为13,因此我将列skin_problem分成最多13个单独的列。然后,我可以查看每一列并将逻辑应用于该列中包含的值
然后我想我应该能够做到:
cases_per_house$ulcer[cases_per_house$p1==1] <-1
如果p1的值为1,则将溃疡溃疡的值设置为1
这有效,我可以重复可能在变量p1中的不同值。
即
cases_per_house$lump[cases_per_house$p1==2] <-1
如果p1的值为2,则将块的值设置为1
我希望能够做的是重复循环通过p1&gt; p13 即
ulcer = 1 if p1 = 1
lump = 1 if p1 = 2
ulcer = 1 if p2 = 1
lump = 1 if p2 = 2
我尝试过使用apply和for循环的方法,但没什么乐趣。 最初我也尝试在原始列上使用grep而不使用单独的但是无法使其工作,因为它很难得出正则表达式,因为列中的数字可以按顺序和数量变化。
希望这一点很清楚 - 如果我能做任何澄清/改进的话,请告诉我
答案 0 :(得分:1)
将值匹配函数应用于分离的数据,匹配为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)
}