【问题标题】:R - Replacing values in dataframes with conditional statements and substringsR - 用条件语句和子字符串替换数据框中的值
【发布时间】:2021-01-21 05:50:03
【问题描述】:

我有一个数据框 df

这是一个包含数百列数据的大型数据框。特别是 40 列具有相似名称的数据 TD1、TD2 ..... TD40。我想扫描每一行,如果任何值以 Z50 开头,我希望列 Category 中的行值更改为“Surgery”。因此,在上面的示例中,第 1 行和第 3 行将从“Cardiac”转换为“Surgery”。

在整个代码为 Z50 的类似示例中,我使用了:

df %>%
rowwise()%>%
mutate(Category = if(any(c_across(starts_with("TD")) == "Z50")) 
                   "Surgery" else Category)

现在我只希望前 3 个字符等于 Z50。我假设我会使用 grepl 函数,但不确定如何将其合并到原始代码中。好吧,到目前为止它对我不起作用。 有任何想法吗?。谢谢

【问题讨论】:

标签: r if-statement replace grepl


【解决方案1】:

我们可以尝试使用applygrepl 作为基本 R 选项:

idx_start <- grep("^TD1$", names(df))
idx_end   <- grep("^TD40$", names(df))

df$Category <- apply(df, 1, function(x) {
    ifelse(sum(grepl("^Z50", x[idx_start:idx_end])) > 0,
           "Surgery", df$Category)
})

【讨论】:

  • 谢谢@Tim。您的建议似乎有效。但是,在代码执行后,我收到一条消息说“有 50 个或更多警告”。有什么让我担心的吗?
  • @dapdot1 最好的办法可能是查看警告。最有可能的是,它们与隐式转换和类似的事情有关。最重要的是生成的结果符合您的期望。
  • 仔细检查后发现代码不起作用。在适用时,它似乎已将“类别”列正确更改为“手术”。但是,它似乎莫名其妙地将 Category 中的所有其他列值更改为仅“Cardiac”列中的第一个值。所以写在诸如“Stroke”之类的值上。非常奇怪,
  • 我意识到代码 idx_start 不会区分列 TD1 和 TD11,因此可能是警告消息的一部分。
  • @dapdot1 检查更新的答案。 grep ^TD1$ 等。
【解决方案2】:

您可以使用grepl 更改您的代码:

library(dplyr)

df %>%
  rowwise()%>%
  mutate(Category = if(any(grepl('^Z50', c_across(starts_with("TD"))))) 
                       "Surgery" else Category)

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2012-09-04
    相关资源
    最近更新 更多