使用 R 中的标签从 df 自动创建变量
Automate variable creation from a df with labels in R
我正在尝试从代码和标签的单独 df 自动创建变量。
我有一个带有字符变量的数据框,该变量由 'JS123B071','JS3243C093'
等代码组成。此字符串中的代码没有逻辑顺序。在一个单独的数据框中,我有代码附带的标签,例如:'JS123B071', name1, 'JS3243C093', name2
我有的是:
id
codelist
1
'JS123B071'
2
JS3243C093','JS123B071'
3
JS123B071' JS3243C093'
我想要的是:
id
codelist
name1
name2
1
'JS123B071'
1
0
2
'JS3243C093','JS123B071'
1
1
3
NA, NA, 'JS123B071', NA, 'JS3243C093'
1
1
所以我想根据字符串中特定代码的存在为每个标签创建一个新变量。我为此使用以下代码:
vec <- 'JS123B071'
df$name1 <- grepl(vec, df$codelist, fixed = TRUE)
df$name1 <- as.numeric(df$name1)
vec2 <- 'JS3243C093'
df$name2 <- grepl(vec2, df$codelist, fixed = TRUE)
df$name2 <- as.numeric(df$name2)
但是,我现在手工挑选代码和标签。但由于我有数以千计的代码和标签,我想自动执行此过程。有没有办法用 for 循环来做到这一点?
您可以将要检查的值放在一个向量中,然后使用 sapply
来检查每个值 grepl
。
vec <- c('JS123B071', 'JS3243C093')
result <- cbind(df, sapply(vec, function(x) as.integer(grepl(x, df$codelist))))
result
# id codelist JS123B071 JS3243C093
#1 1 JS123B071 1 0
#2 2 JS3243C093,JS123B071 1 1
#3 3 JS123B071,JS3243C093 1 1
我正在尝试从代码和标签的单独 df 自动创建变量。
我有一个带有字符变量的数据框,该变量由 'JS123B071','JS3243C093'
等代码组成。此字符串中的代码没有逻辑顺序。在一个单独的数据框中,我有代码附带的标签,例如:'JS123B071', name1, 'JS3243C093', name2
我有的是:
id | codelist |
---|---|
1 | 'JS123B071' |
2 | JS3243C093','JS123B071' |
3 | JS123B071' JS3243C093' |
我想要的是:
id | codelist | name1 | name2 |
---|---|---|---|
1 | 'JS123B071' | 1 | 0 |
2 | 'JS3243C093','JS123B071' | 1 | 1 |
3 | NA, NA, 'JS123B071', NA, 'JS3243C093' | 1 | 1 |
所以我想根据字符串中特定代码的存在为每个标签创建一个新变量。我为此使用以下代码:
vec <- 'JS123B071'
df$name1 <- grepl(vec, df$codelist, fixed = TRUE)
df$name1 <- as.numeric(df$name1)
vec2 <- 'JS3243C093'
df$name2 <- grepl(vec2, df$codelist, fixed = TRUE)
df$name2 <- as.numeric(df$name2)
但是,我现在手工挑选代码和标签。但由于我有数以千计的代码和标签,我想自动执行此过程。有没有办法用 for 循环来做到这一点?
您可以将要检查的值放在一个向量中,然后使用 sapply
来检查每个值 grepl
。
vec <- c('JS123B071', 'JS3243C093')
result <- cbind(df, sapply(vec, function(x) as.integer(grepl(x, df$codelist))))
result
# id codelist JS123B071 JS3243C093
#1 1 JS123B071 1 0
#2 2 JS3243C093,JS123B071 1 1
#3 3 JS123B071,JS3243C093 1 1