考虑以下代码
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
、我们的df
和FUN
(之后的任何元素都作为函数的不变自变量提供。
最简单的方法可能是使用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