繁体   English   中英

在 R 中使用 NA 将数据、类字符转换为数字

[英]Converting Data, Class Character to Numeric w/ NAs in R

有许多与我的问题相关的类似主题,但我已经尝试了解决方案,但未能解决我的问题。

我编写了一个函数来汇总和重新格式化我的数据,但是当我想格式化和舍入数值结果时,我收到以下错误: Error in vapply(x, format, "", big.mark = big.mark, big.interval = big.interval, : values must be length 1, but FUN(X[[1]]) result is length 6

我认为这个问题与 NAs 有关,但是当我尝试将数据从字符重新分类为数字时,我收到以下错误: In Tables(df, x) : NAs introduced by coercion

我创建了一个示例数据集,它重现了我的问题以及我的代码:

library(dplyr, tidyr)

df<-data.frame(Date=c("Sep 2005","May 2005","Sep 2004","Sep 2005","May 2005","Sep 2004"),Group=c("A.A","B.A","A.A","B.B","A.B","B.C"),Category=c("Total","Total","Total","Total","Total","Total"),Cost=c(100025,51580.75,0,357450.25,73040,1754400))


x<-c("A.A","A.B","B.A","B.B","B.C","Total")

Tables<-function(data,x){
  data2<-bind_rows(data %>% group_by(Group,Date)%>% dplyr::summarise(Amt=sum(Cost)),
                   data %>% group_by(Category,Date)%>%dplyr::summarise(Amt=sum(Cost))%>%dplyr::rename(Group = Category)) %>%
    arrange(Date,Group) %>%pivot_wider(names_from = Date,values_from = Amt)%>% slice(match(x, Group))
  
  data2<-data2%>%mutate(QoQ=((as.numeric(.[[4]])-as.numeric(.[[3]]))/as.numeric(.[[3]])))
  
  
  data2[2]<-prettyNum(data2[2],digits=0,big.mark=",",scientific=F)
}

df2<-as.data.frame(Tables(df,x))

理想情况下,我会重新格式化第 2-4 列,但我现在只尝试使用第 2 列。 我试过在我的函数中包含以下内容:

data[2]<-as.double(as.character(data[2]))
  data[[2]]<-as.numeric(data[[2]])
  data[2]<-as.numeric(unlist(data[2]))
# "smart" class conversion
df3[] <- lapply(df3, type.convert, as.is = TRUE)
df3
#> # A tibble: 6 x 4
#> # Groups:   Group [6]
#>   Group `May 2005` `Sep 2004` `Sep 2005`
#>   <chr>      <dbl>      <int>      <dbl>
#> 1 A.A          NA           0    100025 
#> 2 A.B       73040          NA        NA 
#> 3 B.A       51581.         NA        NA 
#> 4 B.B          NA          NA    357450.
#> 5 B.C          NA     1754400        NA 
#> 6 Total    124621.    1754400    457475.

# Confirm
lapply(df3, class)
#> $Group
#> [1] "character"
#> 
#> $`May 2005`
#> [1] "numeric"
#> 
#> $`Sep 2004`
#> [1] "integer"
#> 
#> $`Sep 2005`
#> [1] "numeric"
Created on 2021-10-21 by the reprex package (v2.0.1)

数据:

library(dplyr)
library(tidyr)

df<-data.frame(
  Date=c("Sep 2005","May 2005","Sep 2004","Sep 2005","May 2005","Sep 2004"),
  Group=c("A.A","B.A","A.A","B.B","A.B","B.C"),
  Category=c("Total","Total","Total","Total","Total","Total"),
  Cost=c(100025,51580.75,0,357450.25,73040,1754400))

x<-c("A.A","A.B","B.A","B.B","B.C","Total")

df2 <- bind_rows(
  df %>%
    group_by(Group, Date) %>%
    summarise(Amt = sum(Cost)),
  df %>%
    group_by(Category, Date) %>%
    summarise(Amt = sum(Cost)) %>%
    rename(Group = Category))

df3 <- df2 %>%
  arrange(Date, Group) %>%
  pivot_wider(names_from = Date, values_from = Amt) %>%
  dplyr::slice(match(x, Group))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM