使用 sub() 提取多个列中的字符

Using sub() to extract after a character over multiple columns

提问人:TheBoomerang 提问时间:8/8/2022 最后编辑:PhilTheBoomerang 更新时间:5/5/2023 访问量:59

问:

请考虑以下代码

x <- c('2','75% (3/4)','80% (4/5)','70% (7/10)','90% (9/10)') 
y <- c('1', '50% (1/2)', '25% (1/4)', '30% (3/10)', '40% (2/5)')

df <- data.frame(rbind(x, y))

我想提取 % 符号之前的值,即整数。

我了解我可以使用以下方法执行此操作:

df$X2 <- sub("%.*", "", df$X2)

但是为了避免复制和粘贴,并遍历每一列,有没有办法一步到位呢?

我尝试执行以下操作:

df[-1] <- sub("%.*", "", df[-1])

但这会将格式保留为“c(”75“,这不是我所追求的 - 这里出了什么问题? 有没有其他合适的方法可以做到这一点?

谢谢

R 提取

评论


答:

2赞 Phil 8/8/2022 #1

最简单的方法可能是使用 dplyr 执行此操作:

library(dplyr)

mutate(df, across(everything(), stringr::str_remove, "%.*"))

  X1 X2 X3 X4 X5
x  2 75 80 70 90
y  1 50 25 30 40
2赞 r2evans 8/8/2022 #2

基数 R:

df[] <- lapply(df, sub, pattern = "%.*", replacement = "")
df
#   X1 X2 X3 X4 X5
# x  2 75 80 70 90
# y  1 50 25 30 40

这是必需的,因为默认情况下,返回 a (而不是 )。通过使用分配的 LHS,列的内容将在框架结构内替换。这在对列的子集进行操作时也非常有效,如df[] <-lapplylistdata.framedf[]

df[c(2,3,5)] <- lapply(df[c(2,3,5)], sub, pattern = "%.*", replacement = "")

诚然,这不是您在这里想要的,但提供了一种自定义哪些列受到影响的方法。

这与使用匿名函数相同:lapply(df, sub, ...)

lapply(df, function(z) sub("%.*", "", z))

因为参数的元素(这里)是作为第一个参数传递给函数的(这将是),我们显式地将常量值作为补充参数传递给 ,其中前两个参数(,我们的;和)之后的任何内容都作为函数的不变参数提供。dfpattern=lapplyXdfFUN

1赞 12666727b9 8/8/2022 #3

也许这可能是您正在寻找的输出?

for (i in colnames(df)){
  df[,i] <- sub("%.*", "", df[,i])
}
print(df)
  X1 X2 X3 X4 X5
x  2 75 80 70 90
y  1 50 25 30 40

评论

1赞 TheBoomerang 8/9/2022
我确实尝试过做这样的事情!但是我没有做 df[ ,i],而是在做 df[i]
0赞 r2evans 8/9/2022
警告词 : 以 s 为基数 s 和 when ,则返回一个向量;如果 ,或者总是 和 ,这将返回一个 OR(带列),而不是向量。 当不是向量时当然没有用。df[,i]data.framelength(i) == 1length(i) > 1tbl_dfdata.tabletbl_dfdata.tablelength(i)sub(..., df[,i])df[,i]