【问题标题】:Loop selection of data subsets across a series of columns to generate new variables在一系列列中循环选择数据子集以生成新变量
【发布时间】:2018-03-03 17:31:51
【问题描述】:

我试图找到生成一系列 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,则 new 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,则设置lump的值为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 而不使用单独的,但由于列中的数字可以按顺序和数量变化,因此很难想出一个正则表达式。

希望这很清楚 - 如果我能做些什么来澄清/改进问题,请告诉我

【问题讨论】:

  • 只是为了理想地添加 tidyverse 或 base R 方法,因为这些是我最熟悉的工具套件

标签: r for-loop apply


【解决方案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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多