R语言 使用sub()在多个列上提取字符

rekjcdws  于 2023-05-11  发布在  其他
关注(0)|答案(3)|浏览(166)

考虑以下代码

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‘,这不是我所追求的-这里出了什么问题?有没有其他合适的方法来做到这一点?
谢谢

w80xi6nr

w80xi6nr1#

碱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

df[] <-是必需的,因为默认情况下,lapply返回list(而不是data.frame)。通过在赋值的LHS上使用df[],列的 * 内容 * 在帧的结构内被替换。在对列的子集进行操作时,这也能很好地工作,如

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

这显然不是您在这里想要的,但是提供了一种自定义受影响的列的方法。
lapply(df, sub, ...)与匿名函数的用法相同:

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

因为参数的元素(这里是df)作为第一个参数传递给函数(它将是pattern=),我们显式地将常量值作为补充参数传递给lapply,其中前两个参数(X,我们的df;和FUN)作为不变的参数提供给函数。

ki1q1bka

ki1q1bka2#

最简单的方法可能是使用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
h9vpoimq

h9vpoimq3#

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

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

相关问题