r - 4 列宽数据框到 3 列长数据框

标签 r dplyr wide-column-store

<分区>

我有一个数据框(下面的示例),如下所示:

df = structure(list(Stage1yBefore = c("3.1", "1", "4", "2", "NA"), 
Stage2yBefore = c("NA", "2", "3.2", "2", "NA"), ClinicalActivity1yBefore = 
c(TRUE, 
TRUE, TRUE, TRUE, FALSE), ClinicalActivity2yBefore = c(FALSE, 
TRUE, TRUE, TRUE, FALSE)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -5L))

我想使用 dplyr 将其转换为长格式,但由于某种原因出现错误。

输出应该看起来像(转换 df 的第一行):

Output = data_frame(TimeFrame = c("1y", "2y"), Stage = c(3, NA), Clinical = 
c(T, F))

因此 df 的每一行在输出中变成 2 行。

我试过的方法不起作用(实际上我不确定具体该怎么做):

Output = gather(df, TimeFrame, Stage, Clinical, Stage1yBefore:ClinicalActivity2yBefore)

我得到:

Error in .f(.x[[i]],...): Object 'Clinical' not found.

有什么想法吗?

最佳答案

library(dplyr)
library(stringr)
library(tidyr)
df %>% rownames_to_column() %>% 
       gather(TimeFrame, Stage, Stage1yBefore:ClinicalActivity2yBefore) %>% 
       #From TimeFrame extract a digit followed by y, also Stage or Clinical 
       mutate(Time=str_extract(TimeFrame,'\\dy'), Key=str_extract(TimeFrame,'Stage|Clinical')) %>% 
       dplyr::select(-TimeFrame) %>% 
       spread(Key,Stage)

# A tibble: 10 x 4
  rowname Time  Clinical Stage
  <chr>   <chr> <chr>    <chr>
  1 1       1y    TRUE     3.1  
  2 1       2y    FALSE    NA   
  3 2       1y    TRUE     1    
  4 2       2y    TRUE     2    
  5 3       1y    TRUE     4    
  6 3       2y    TRUE     3.2  
  7 4       1y    TRUE     2    
  8 4       2y    TRUE     2    
  9 5       1y    FALSE    NA   
 10 5       2y    FALSE    NA

关于r - 4 列宽数据框到 3 列长数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56685106/

相关文章:

r - 更改facet_wrap多重图中的绘图标题大小

r - 如何改变 "position_dodge"一个点而不是 ggplot2 系列中的其他点

r - 在 dplyr 中取消列出包含日期列表的列

r - 何时在 dplyr 中使用 "Do"函数

cassandra - 在 Cassandra 上如何启用 LDAP 身份验证

cassandra - 比较 Cassandra 结构与关系数据库

r - 如何根据 R 中的特定行值对列进行子集化?

删除输出中的级别属性 - R

r - 选择 R 中第一个值等于 "x"的组