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

问题描述 投票:0回答:1

我试图找到生成一系列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和12,则该列包含"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> p13,即

ulcer = 1 if p1 = 1 
lump = 1 if p1 = 2
ulcer = 1 if p2 = 1
lump = 1 if p2 = 2

我尝试过使用apply和for循环的方法,但没什么好玩的。最初我也尝试在原始列上使用grep而不使用单独的但是由于列中的数字可能因顺序和数量而异,因此很难得到正则表达式。

希望这很清楚 - 如果我能做任何事情澄清/改进问题,请告诉我

r for-loop apply
1个回答
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)
}
© www.soinside.com 2019 - 2024. All rights reserved.