我得到了一个.txt文件,它在数字的末尾有符号。
当我尝试将其转换为数字时,-ve 值将变为 NA,因为数据是字符格式。我什至尝试过,标记这些 -ve 值并将标记的值乘以"-1"。
因为我有大约 25 个这样的专栏。它变得越来越复杂。 谁能建议我简单的方法来做到这一点。
以下是我准备的示例数据,
R1 <- c("15515.88-","5156.04","65656","1566.1-")
R2 <- c("515","5156.11-","415-","1455-")
R3 <- c("123.14-","9875-","1247-","778.04-")
df <- data.frame(R1,R2,R3)
我的预期输出是首字母处的 -ve 符号,
R1 R2 R3
-15515.88 515 -123.14
5156.04 -5156.11 -9875
65656 -415 -1247
-1566.1 -1455 -778.04
需要您的帮助
在基本 R 中,您可以使用 lapply 使用正则表达式一次处理一列并转换为数字。
df[] <- lapply(df, function(x) as.numeric(sub("(.+)(-)", "\2\1", x)))
df
# R1 R2 R3
# 1 -15515.88 515.00 -123.14
# 2 5156.04 -5156.11 -9875.00
# 3 65656.00 -415.00 -1247.00
# 4 -1566.10 -1455.00 -778.04
base R 中的一个解决方案是
df[] <- lapply(df, function(x) {as.numeric(ifelse(grepl("-", x), paste0("-", gsub("-", "", x)), x))})
基本上它的工作原理是这样的:如果存在-
,则将其删除并在值的开头添加另一个-
,然后将列转换为数字。
输出
# R1 R2 R3
# 1 -15515.88 515.00 -123.14
# 2 5156.04 -5156.11 -9875.00
# 3 65656.00 -415.00 -1247.00
# 4 -1566.10 -1455.00 -778.04
rep.format <- function(num){
ind <- grepl("-", num)
num[ind] <- paste0("-", sub("-", "", num[ind]), "")
num
}
R1 <- c("15515.88-","5156.04","65656","1566.1-")
R2 <- c("515","5156.11-","415-","1455-")
R3 <- c("123.14-","9875-","1247-","778.04-")
df <- data.frame(rep.format(R1),rep.format(R2),rep.format(R3))
df
我希望这有帮助!