考虑以下代码
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‘,这不是我所追求的-这里出了什么问题?有没有其他合适的方法来做到这一点?
谢谢
3条答案
按热度按时间w80xi6nr1#
碱R:
df[] <-
是必需的,因为默认情况下,lapply
返回list
(而不是data.frame
)。通过在赋值的LHS上使用df[]
,列的 * 内容 * 在帧的结构内被替换。在对列的子集进行操作时,这也能很好地工作,如这显然不是您在这里想要的,但是提供了一种自定义受影响的列的方法。
lapply(df, sub, ...)
与匿名函数的用法相同:因为参数的元素(这里是
df
)作为第一个参数传递给函数(它将是pattern=
),我们显式地将常量值作为补充参数传递给lapply
,其中前两个参数(X
,我们的df
;和FUN
)作为不变的参数提供给函数。ki1q1bka2#
最简单的方法可能是使用dplyr:
h9vpoimq3#
也许这可能是您正在寻找的输出?