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