【问题标题】:Using gsub on columns in R在 R 中的列上使用 gsub
【发布时间】:2018-03-22 14:27:26
【问题描述】:

我在 R 中有一个包含数千行和 10 列的数据框(数据)。 其中 9 列包含多个级别的因子。

这是数据框的一小部分。

一个 gr1

10 303.90

11 304.1

12 303.6

13 303.90 块

14 303.90k

例如,一个因素的水平是“303.90”,另一个水平是“303.90 obs”。我想将“303.90 obs”更改为“303.90”。 我正在使用以下命令来编辑关卡的名称。

data[] = as.data.frame(lapply(data, function(x) {x = gsub("303.90 obs","303.90", fixed = T, x)}))

但这不会将级别“303.90 obs”更改为“303.90”。它只是保持不变。 这个命令仍然适用于其他字符串,例如。 “303.9”更改为“303.90” 当我使用时:

data[] = as.data.frame(lapply(data, function(x) {x = gsub("303.9 obs","303.90", fixed = T, x)}))

关于为什么会这样的任何建议?

【问题讨论】:

  • 首先,从lapply 中删除x=。二、请提供小样本数据:stackoverflow.com/questions/5963269/…
  • 所以你也想把303.90k改成303.90?然后你需要正则表达式。
  • 我认为我的代码可能正在替换“303.90 obs”的“303.90”部分,但仍在打印字符串的其余部分。会是这样吗?
  • 是的。 303.90k 也应该改变。我会尝试使用正则表达式,但我认为 gsub 无论如何都应该适用于这个例子。在继续使用正则表达式之前,需要弄清楚它为什么不起作用。
  • @gwarr:我更新了我的脚本。请检查这是否有效。

标签: r gsub


【解决方案1】:

我对 lapply 不太熟悉,因此我的解决方案只是循环遍历数据框的列。这可以正常工作。

col1 <- 1:10
col2 <- 21:30
col3 <- c("503.90", "303.90 obs", "803.90sfsdf sf", "203.90 obs", "303.90", "103.90 obs", "303.90", "403.90 obs", "803.90sfsdf sf", "303.90 obs")
col4 <- c("303.90", "303.90 obs", "303.90", "203.90 obs", "303.90", "107.40fghfg", "303.90", "303.90 obs", "303.90", "303.90 obs")

data <- data.frame(col1, col2, col3, col4)

data$col3 <- as.factor(data$col3)
data$col4 <- as.factor(data$col4)

for(i in 3:4) {
  matchedExpression = regexpr(pattern = "\\d+\\.\\d+", text = data[,i])
  data[,i] = regmatches(x = data[,i], m = matchedExpression)
  data[,i] <- as.factor(data[,i])
}

编辑

OP 更改了描述。将所有因素更改为303.90regex 是一个更好的解决方案。但是,需要 OP 提供更多信息才能给出通用解决方案,例如只有303.90应该改吗?

EDIT2

更新了脚本,因为 OP 提供了更多信息,例如列可以具有与 303.90 不同的因子。

【讨论】:

  • 这种方法对我不起作用。 “303.90 obs”未更改为“303.90”。
  • 当你复制粘贴脚本并执行它时,你会看到它可以工作。如果我的代码不适用于您的数据框,则您没有提供足够的信息。见stackoverflow.com/questions/5963269/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2018-10-28
  • 1970-01-01
  • 2022-12-17
  • 2019-11-19
  • 1970-01-01
相关资源
最近更新 更多