r-使用sub()在多列中的一个字符后面进行提取



考虑以下代码

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:

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、我们的dfFUN(之后的任何元素都作为函数的不变自变量提供。

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

也许这可能是您想要的输出?

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

最新更新