【问题标题】:Automate variable creation from a df with labels in R使用 R 中的标签从 df 自动创建变量
【发布时间】:2021-07-30 12:30:49
【问题描述】:

我正在尝试从单独的代码和标签 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 循环做到这一点?

【问题讨论】:

  • 您的意思是在这种情况下您想要一个名为df$name1 的变量?可能是个坏主意,而是只使用一个列表:vars &lt;- list(); vars[[df$name1]] &lt;- vec 等。
  • @dash2 感谢您的评论!如果代码存在于字符串中,我希望每个代码和每个观察值都为 1,否则为 0。为了以后能够解释新变量,我希望标签作为变量名。
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example

标签: r loops variables character


【解决方案1】:

您可以将要检查的值放入向量中,然后使用sapplygrepl 检查每个值。

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

【讨论】:

  • 非常感谢,这行得通!还有一种方法可以根据标签转换变量名吗?
  • 如果标签存储在变量 lab 中(例如 - lab &lt;- c('name1', 'name2'))。您可以通过names(result)[-(1:2)] &lt;- lab 更改列名
  • 谢谢!我在 df 中有更多列,所以现在会覆盖名字,但我想我可以弄清楚。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 2019-04-27
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
相关资源
最近更新 更多