Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法通过在R中有条件地汇总不同的列来重建新的数据帧?_R_Dplyr - Fatal编程技术网

有没有办法通过在R中有条件地汇总不同的列来重建新的数据帧?

有没有办法通过在R中有条件地汇总不同的列来重建新的数据帧?,r,dplyr,R,Dplyr,我正试图通过总结和调整不同的列,从输入数据重建新的数据框架。我已经使用dplyr实用程序来完成这项工作,但没有得到预期的输出。本质上,在我的输入数据中,我打算先按主题对主题进行分组,然后按其传输时间进行汇总,然后确定主题在环境列中是否有ICU字符串,在级别列中是否有密集字符串。我通过先获取两个子数据帧,然后按公共主题列合并它们,找到了实现这一点的方法,但合并的数据帧并不是我所期望的 可再现数据 以下是从原始输入数据中获取的 我目前的尝试 如何从输入数据帧中获得这样的输出?我的代码哪里错了?有没有

我正试图通过总结和调整不同的列,从输入数据重建新的数据框架。我已经使用dplyr实用程序来完成这项工作,但没有得到预期的输出。本质上,在我的输入数据中,我打算先按主题对主题进行分组,然后按其传输时间进行汇总,然后确定主题在环境列中是否有ICU字符串,在级别列中是否有密集字符串。我通过先获取两个子数据帧,然后按公共主题列合并它们,找到了实现这一点的方法,但合并的数据帧并不是我所期望的

可再现数据

以下是从原始输入数据中获取的

我目前的尝试


如何从输入数据帧中获得这样的输出?我的代码哪里错了?有没有办法做到这一点?

纠正这种行为的一个方法是在末尾添加complete

library(dplyr)
library(tidyr)
final_df <- merge(df_1, df_2, by.x="subject", by.y="subject")
final_df %>%
       complete(subject = paste('Subject', 1:7), fill = list(flag = 0))
# A tibble: 7 x 3
#  subject   first_icu  flag
#  <chr>         <int> <dbl>
#1 Subject 1        NA     0
#2 Subject 2        NA     0
#3 Subject 3       154     1
#4 Subject 4        NA     0
#5 Subject 5       571     1
#6 Subject 6        NA     0
#7 Subject 7       298     1
或者,如果我们必须以一种更紧凑的方式来做这件事

library(stringr)
dat %>% 
   group_by(subject) %>%
   summarise(first_icu = min(transfer_time[str_detect(level, 'Intensive')], na.rm = TRUE), 
   flag = +(sum(str_detect(environment, 'ICU') & str_detect(level, 'Intensive')) > 0)) %>%
   mutate(first_icu = na_if(first_icu, Inf))
在R基地,我们可以

out <- do.call(rbind, lapply(split(dat, dat$subject), 
 function(x) data.frame(subject = x$subject[1], 
     first_icu = min(x$transfer_time[grepl(x = x$level, 
   'Intensive')], na.rm = TRUE), 
   flag = sum(grepl("ICU", x$environment) & grepl("Intensive", x$level)))))

 out$first_icu[is.infinite(out$first_icu)] <- NA
 out$flag <- +(out$flag > 0)

纠正该行为的一种方法是在末尾添加complete

library(dplyr)
library(tidyr)
final_df <- merge(df_1, df_2, by.x="subject", by.y="subject")
final_df %>%
       complete(subject = paste('Subject', 1:7), fill = list(flag = 0))
# A tibble: 7 x 3
#  subject   first_icu  flag
#  <chr>         <int> <dbl>
#1 Subject 1        NA     0
#2 Subject 2        NA     0
#3 Subject 3       154     1
#4 Subject 4        NA     0
#5 Subject 5       571     1
#6 Subject 6        NA     0
#7 Subject 7       298     1
或者,如果我们必须以一种更紧凑的方式来做这件事

library(stringr)
dat %>% 
   group_by(subject) %>%
   summarise(first_icu = min(transfer_time[str_detect(level, 'Intensive')], na.rm = TRUE), 
   flag = +(sum(str_detect(environment, 'ICU') & str_detect(level, 'Intensive')) > 0)) %>%
   mutate(first_icu = na_if(first_icu, Inf))
在R基地,我们可以

out <- do.call(rbind, lapply(split(dat, dat$subject), 
 function(x) data.frame(subject = x$subject[1], 
     first_icu = min(x$transfer_time[grepl(x = x$level, 
   'Intensive')], na.rm = TRUE), 
   flag = sum(grepl("ICU", x$environment) & grepl("Intensive", x$level)))))

 out$first_icu[is.infinite(out$first_icu)] <- NA
 out$flag <- +(out$flag > 0)

@除了有限性之外,我还添加了一种新的方法——如何仅使用基本实用程序进行相同的操作?我对你的解决办法感到惊讶。再次感谢您的帮助。我可能会收集您所有的回复帖子来创建cheetsheet。谢谢你的帮助contribution@beyond_inifinity添加了一个带有base的选项R@beyond_inifinityv1 0返回逻辑as.integerv1>0或+v1>0将TRUE/FALSE强制为1/0@beyond_inifinity我添加了一个新的方法如何仅使用基本实用程序进行相同的操作?我对你的解决办法感到惊讶。再次感谢您的帮助。我可能会收集您所有的回复帖子来创建cheetsheet。谢谢你的帮助contribution@beyond_inifinity添加了一个带有base的选项R@beyond_inifinityv1 0返回逻辑as.integerv1>0或+v1>0将TRUE/FALSE强制为1/0