首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据单元格值创建新行?

如何根据单元格值创建新行?
EN

Stack Overflow用户
提问于 2021-01-01 07:38:35
回答 1查看 59关注 0票数 1

我有一个数据帧df,其中:

代码语言:javascript
复制
 Days    Treatment A   Treatment B   Treatment C 
 0           5             1             1   
 1           0             2             3      
 2           1             1             0         

例如,有5个接受处理A的个体存活了0天,1个个体存活了2天,等等。然而,我希望这5个个体现在成为一个唯一的行,该单元格表示他们存活的天数:

代码语言:javascript
复制
 Patient #   A   B   C       
 1           0        
 2           0  
 3           0      
 4           0        
 5           0   
 6           2      
 7               0         
 8               1   
 9               1     
 10              2        
 11                  0
 12                  1   
 13                  1      
 14                  1

让患者号=任意值。

我很抱歉,如果这不是足够的描述,但我感谢您提供的任何和所有的帮助!目前我在Excel中有数据集,但如果这样更容易的话,我可以将它放入R中。

EN

回答 1

Stack Overflow用户

发布于 2021-01-01 07:45:55

我们可以用list中的每个‘rep’列值来复制'Days‘的值,然后创建序列的list,使用Map构造data.frame,最后使用bind_rows

代码语言:javascript
复制
library(dplyr)
lst1 <- lapply(df[-1], function(x) rep(df$Days, x))
bind_rows(Map(function(x, y, z) setNames(data.frame(x, y), 
   c("Patient", z)),  relist(seq_along(unlist(lst1)), 
       skeleton = lst1), lst1, sub("Treatment\\s+", "", names(lst1))))

-output

代码语言:javascript
复制
#    Patient  A  B  C
#1        1  0 NA NA
#2        2  0 NA NA
#3        3  0 NA NA
#4        4  0 NA NA
#5        5  0 NA NA
#6        6  2 NA NA
#7        7 NA  0 NA
#8        8 NA  1 NA
#9        9 NA  1 NA
#10      10 NA  2 NA
#11      11 NA NA  0
#12      12 NA NA  1
#13      13 NA NA  1
#14      14 NA NA  1

或者另一种选择,先重塑为“long”,然后再重塑为“with”

代码语言:javascript
复制
library(tidyr)
df %>%
    pivot_longer(cols = -Days) %>% 
    separate(name, into = c('name1', 'name2')) %>% 
    group_by(name2) %>%
    summarise(value = rep(Days, value), .groups = 'drop') %>% 
    mutate(Patient = row_number()) %>%
    pivot_wider(names_from = name2, values_from = value)

-output

代码语言:javascript
复制
# A tibble: 14 x 4
#   Patient     A     B     C
#     <int> <int> <int> <int>
# 1       1     0    NA    NA
# 2       2     0    NA    NA
# 3       3     0    NA    NA
# 4       4     0    NA    NA
# 5       5     0    NA    NA
# 6       6     2    NA    NA
# 7       7    NA     0    NA
# 8       8    NA     1    NA
# 9       9    NA     1    NA
#10      10    NA     2    NA
#11      11    NA    NA     0
#12      12    NA    NA     1
#13      13    NA    NA     1
#14      14    NA    NA     1

数据

代码语言:javascript
复制
df <- structure(list(Days = 0:2, `Treatment A` = c(5L, 0L, 1L), 
  `Treatment B` = c(1L, 
2L, 1L), `Treatment C` = c(1L, 3L, 0L)), class = "data.frame", row.names = c(NA, 
-3L))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65526301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档