【问题标题】:How to sovle self-defining function to count can't work如何解决自定义函数计数不起作用
【发布时间】:2019-06-08 07:27:58
【问题描述】:

我写了一个函数来计算每天住院人数,但是当数字在某些天数为 0 时它就无法工作。 我的功能:

tsdata2 <- function(df){

  t.f <- as.data.frame(table(df$DATE_INHOSPITAL2)) %>% rename(whole =Freq)
  ## sex
  man.d <- df %>% filter(GENDER == 1) 
  man.f <- as.data.frame(table(man.d$DATE_INHOSPITAL2)) %>% rename(man =Freq)

  woman.d <- df %>% filter(GENDER == 2) 
  woman.f <- as.data.frame(table(woman.d$DATE_INHOSPITAL2)) %>% rename(woman =Freq)

  ## age 65
  agelo65.d <- df %>% filter(age_group65 == 1)
  agelo65.f <- as.data.frame(table(agelo65.d$DATE_INHOSPITAL2)) %>% rename(agelo65 =Freq)

  ageup65.d <- df %>% filter(age_group65 == 2)
  ageup65.f <- as.data.frame(table(ageup65.d$DATE_INHOSPITAL2)) %>% rename(ageupwith65 =Freq)

  ## age 10
  age10.1.d <- df %>% filter(age_group10 == 1)
  age10.1.d.f <- as.data.frame(table(age10.1.d$DATE_INHOSPITAL2)) %>% rename(agelo40 =Freq)

  age10.2.d <- df %>% filter(age_group10 == 2)
  age10.2.d.f <- as.data.frame(table(age10.2.d$DATE_INHOSPITAL2)) %>% rename(age41_50 =Freq)

  age10.3.d <- df %>% filter(age_group10 == 3)
  age10.3.d.f <- as.data.frame(table(age10.3.d$DATE_INHOSPITAL2)) %>% rename(age51_60 =Freq)

  age10.4.d <- df %>% filter(age_group10 == 4)
  age10.4.d.f <- as.data.frame(table(age10.4.d$DATE_INHOSPITAL2)) %>% rename(age61_70 =Freq)

  age10.5.d <- df %>% filter(age_group10 == 5)
  age10.5.d.f <- as.data.frame(table(age10.5.d$DATE_INHOSPITAL2)) %>% rename(age71_80 =Freq)

  age10.6.d <- df %>% filter(age_group10 == 6)
  age10.6.d.f <- as.data.frame(table(age10.6.d$DATE_INHOSPITAL2)) %>% rename(ageup80 =Freq)

  datebreaks<-seq(as.Date("2014-01-01"),as.Date("2018-12-31"),by="1 day")

  full <- data.frame(Var1 = as.character(datebreaks) )


  result <- full %>% 
    left_join(t.f) %>% 
    left_join(man.f) %>% 
    left_join(woman.f) %>% 
    left_join(agelo65.f) %>% 
    left_join(ageup65.f) %>% 
    left_join(age10.1.d.f) %>% 
    left_join(age10.2.d.f) %>% 
    left_join(age10.3.d.f) %>% 
    left_join(age10.4.d.f) %>% 
    left_join(age10.5.d.f) %>% 
    left_join(age10.6.d.f) %>% replace(., is.na(.), 0)

  return(result)
}



list <- split(total,total$DISEASE_CODE1_2to3)

test <- map(list,tsdata2)

我认为错误是因为某一天的住院人数为零。

如何改进此代码,即使数字为零也可以工作。

test <- map(list,tsdata2)
Joining, by = "Var1"
Joining, by = "Var1"
Joining, by = "Var1"
Joining, by = "Var1"
Joining, by = "Var1"
Joining, by = "Var1"
Error: `by` required, because the data sources have no common variables

【问题讨论】:

  • 这是一些可怕的代码,其中包含许多应以编程方式处理的重复操作。如果您要提供最少的样本数据和预期的输出,那将非常有帮助。这对我来说似乎是XY problem,而且很可能有更好的方法来实现你所追求的。但是为了让我们提供具体的帮助,我们需要具体的(最少的)样本数据。

标签: r function


【解决方案1】:

引发此类错误的原因是您将left_join 应用于没有要连接的列的空数据帧。在您的数据框过滤和列联表创建过程中,生成了没有要连接的列的数据框。请看下面的模拟:

library(dplyr)
df1 <- data.frame(a = 1:10, b = letters[1:10])
df2 <- data.frame(a = 1:10, c = letters[11:20])
df2 <- df2[,-c(1, 2)]
str(df2)
# 'data.frame': 10 obs. of  0 variables

df2 %>% left_join(df1)

上面的代码抛出错误:

错误:by 必填,因为数据源没有共同点 变量调用rlang::last_error()查看回溯

为避免此类问题,您可以执行简单的检查数据框是否没有列,然后更改为虚拟数据框:

library(dplyr)
df1 <- data.frame(a = 1:10, b = letters[1:10])
df2 <- df1[,-c(1, 2)]
df_dummy <- data.frame(a = 1, c = 0)
if(ncol(df2) == 0) df2 <- df_dummy
df1 %>% left_join(df2)
# 
# Joining, by = "a"
# a b  c
# 1   1 a  0
# 2   2 b NA
# 3   3 c NA
# 4   4 d NA
# 5   5 e NA
# 6   6 f NA
# 7   7 g NA
# 8   8 h NA
# 9   9 i NA
# 10 10 j NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 2021-06-29
    相关资源
    最近更新 更多