R: мутировать строки в нескольких условиях - PullRequest
0 голосов
/ 09 октября 2018

Я новичок в R и столкнулся с проблемой.Я хочу изменить цифры на основе их значений и указать их соответствующие единицы (числовой -> символ).Было бы идеально оценить по строке (но не по столбцу).Вот простой пример, и я надеюсь, что вы можете получить мою идею из моей функции, которая не работает.Большое спасибо!

text_tbl <- data.frame(Items = c("Item1", "Item2", "Item3"),
                       Value1 = c(0.9, 11.5, 3000.5),
                       Value2 = c(0.1, 205.5, 1200.5))

transform_scale <- function(x) {
  if(any(x > =1000)) {
    y <- x/1000
    y <- signif(y, digits = 2)
    x <- cat(paste(y, "tn", sep = ""))
  } else if(any(x < 1)) {
    y <- x*1000
    y <- signif(y, digits = 2)
    x <- cat(paste(y, "mn", sep = ""))
  } else {
    x <- signif(x, digits = 2)
    x <- cat(paste(x, "bn", sep = ""))
  }
}

text_tbl[1:3, 2:3] <- apply(text_tbl[1:3, 2:3], 1, transform_scale)

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Более общее решение вопроса, отправленного мной:

transform<-function(x){
if(!is.na(x)){
x<-as.numeric(as.character(x))
if(abs(x)<1e6){
x<-as.character(paste(format(round(x/10^3,1),nsmall=1),"th",sep=""))
}else if(abs(x)<1e9&abs(x)>=1e6){
x<-as.character(paste(format(round(x/10^6,1),nsmall=1),"m",sep=""))
}else if(abs(x)<1e12&abs(x)>=1e9){
x<-as.character(paste(format(round(x/10^9,1),nsmall=1),"b",sep=""))
}else if(abs(x)>=1e12){
x<-as.character(paste(format(round(x/10^12,1),nsmall=1),"t",sep=""))
}
}else{
x<-NA
}
}
0 голосов
/ 09 октября 2018

Вы имели в виду это?

library(dplyr)

text_tbl %>%
  mutate_at(vars(Value1:Value2), 
            funs(new = case_when(. >= 1000 ~ paste(signif(./1e3, 2), "tn"),
                                 . < 1     ~ paste(signif(.*1e3, 2), "mn"),
                                 TRUE      ~ paste(signif(., 2), "bn"))))

, что дает

  Items Value1 Value2 Value1_new Value2_new
1 Item1    0.9    0.1     900 mn     100 mn
2 Item2   11.5  205.5      12 bn     210 bn
3 Item3 3000.5 1200.5       3 tn     1.2 tn


Пример данных:

text_tbl <- structure(list(Items = structure(1:3, .Label = c("Item1", "Item2", 
"Item3"), class = "factor"), Value1 = c(0.9, 11.5, 3000.5), Value2 = c(0.1, 
205.5, 1200.5)), .Names = c("Items", "Value1", "Value2"), row.names = c(NA, 
-3L), class = "data.frame")

#  Items Value1 Value2
#1 Item1    0.9    0.1
#2 Item2   11.5  205.5
#3 Item3 3000.5 1200.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...