提问人:TheBoomerang 提问时间:8/8/2022 最后编辑:PhilTheBoomerang 更新时间:5/5/2023 访问量:59
使用 sub() 提取多个列中的字符
Using sub() to extract after a character over multiple columns
问:
请考虑以下代码
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“,这不是我所追求的 - 这里出了什么问题? 有没有其他合适的方法可以做到这一点?
谢谢
答:
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[] <-
lapply
list
data.frame
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
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.frame
length(i) == 1
length(i) > 1
tbl_df
data.table
tbl_df
data.table
length(i)
sub(..., df[,i])
df[,i]
评论