Преобразовать числа в римские цифры в сапли в R - PullRequest
0 голосов
/ 26 февраля 2019

Как уже упоминалось в посте Преобразование римских цифр в числа в R есть функция для преобразования чисел в римские цифры.Тем не менее, при попытке выполнить преобразование в числовой фильтрации не числовые символы

sequence.to_roman<-c(1,2,"V1","df",3)
sapply(sequence.to_roman, function(x) if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols")

цифры остаются прежними.Хотя он прекрасно работает поэлементно.Это функция as.roman или символьное представление (например, кодировка), которая ведет себя неправильно?

1 Ответ

0 голосов
/ 26 февраля 2019

Привет,

Я думаю, что вам нужно добавить символ as.charcter следующим образом:

    sapply(sequence.to_roman, function(x) as.character(if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols"))
> sapply(sequence.to_roman, function(x) as.character(if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols"))
             1              2             V1             df              3 
           "I"           "II" "Some symbols" "Some symbols"          "III" 

похоже, что сокращение вывода в sapply приведет к преобразованию класса roman обратно в егочисловое значение по умолчанию.Таким образом, преобразование всех выходных данных в char сначала предотвращает это.

try:

lapply(sequence.to_roman, function(x) if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols")
> lapply(sequence.to_roman, function(x) if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols")
[[1]]
[1] I

[[2]]
[1] II

[[3]]
[1] "Some symbols"

[[4]]
[1] "Some symbols"

[[5]]
[1] III

это то, что мы хотим, но:

unlist(lapply(sequence.to_roman, function(x) if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols"))
> unlist(lapply(sequence.to_roman, function(x) if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols"))
[1] "1"            "2"            "Some symbols" "Some symbols" "3"   

также дает формы перекодирования.

, возможно, болеевидимое описание, что вызывает проблему:

> as.roman("3")
[1] III
> as.character(as.roman("3"))
[1] "III"
> c(as.roman("3"), "test")
[1] "3"    "test"
> c(as.character(as.roman("3")), "test")
[1] "III"  "test"
...