Как извлечь - подпишите из хвоста и поставьте перед числом - PullRequest
2 голосов
/ 19 июня 2020

У меня есть файл .txt со знаком в конце числа.

Когда я попытался преобразовать его в numeri c, значения -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

Нужна ваша помощь

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

В базе R вы можете использовать lapply для обработки одного столбца за раз с помощью регулярного выражения и преобразования в числа c.

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
1 голос
/ 19 июня 2020
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

Надеюсь, это поможет!

1 голос
/ 19 июня 2020

Одним из решений в базе R будет

df[] <- lapply(df, function(x) {as.numeric(ifelse(grepl("-", x), paste0("-", gsub("-", "", x)), x))})

В основном это работает так: если присутствует -, вы удаляете его и добавляете еще - в начале значения, и затем вы конвертируете столбец в numeri c.

Output

#          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
...