繁体   English   中英

修改一行数据以获得漂亮的 output(摘要),重塑 - 将行拆分为新的多列

[英]Modification of one row of data to get an nice looking output (summary), reshape - split rows to new multiple columns

我再次需要你的帮助。 通常我知道如何解决我的问题,但在这种情况下我不知道。 这是我的数据示例:

df <- t(data.frame(b = list(c('C:1874 N:3493','C:2642 A:7 M:1 N:2717','A:5298 N:69','C:5366 Y:1','A:5359 G:8'))))
row.names(df) <- 'x'
colnames(df) <- c('V1','V2','V3','V4','V5')
df

  V1              V2                      V3            V4           V5          
x "C:1874 N:3493" "C:2642 A:7 M:1 N:2717" "A:5298 N:69" "C:5366 Y:1" "A:5359 G:8"

我正在寻找一个存储在 df 中的不错的摘要,就像这样NA可以替换为空白或零:

    V1    V2    V3    V4    V5
A   NA    7     5298  NA    5359
C   1874  2642  NA    5366  NA
N   3493  2717  69    NA    NA
M   NA    1     NA    NA    NA
Y   NA    NA    NA    1     NA
G   NA    NA    NA    NA    8

到目前为止,我知道如何将元素从一列轻松拆分为新行:

library(tidyr)
separate_rows(as.data.frame(df), V1, sep = " ")

  V1     V2                    V3          V4         V5        
  <chr>  <chr>                 <chr>       <chr>      <chr>     
1 C:1874 C:2642 A:7 M:1 N:2717 A:5298 N:69 C:5366 Y:1 A:5359 G:8
2 N:3493 C:2642 A:7 M:1 N:2717 A:5298 N:69 C:5366 Y:1 A:5359 G:8

output 不是很好,因为所有剩余的列都填充了来自第一列的结果,但我想在sapply()cbind()中执行此操作以获取一个数据帧,其中包含来自每个输入列的结果数据帧。 但不知道接下来会发生什么。 如何将每个字母放在第一列并做出很好的总结。

先感谢您!

这可以满足您的要求:

library(tidyverse)

df %>% 
  t() %>% 
  as_tibble(rownames = "colname") %>% # two columns: 'colname' (V1...V5) and 'x' (values)
  separate_rows(x, sep = " ") %>% # spread 'x' over rows
  separate(x, c("rowname", "value"), sep = ":") %>% # separate letter and value into two columns 'rowname' and 'value' 
  pivot_wider(names_from = "colname", values_from = "value") %>% # pivot into the wide form you want
  arrange(rowname) # sort by rowname

这使

# A tibble: 6 x 6
  rowname V1    V2    V3    V4    V5   
  <chr>   <chr> <chr> <chr> <chr> <chr>
1 A       NA    7     5298  NA    5359 
2 C       1874  2642  NA    5366  NA   
3 G       NA    NA    NA    NA    8    
4 M       NA    1     NA    NA    NA   
5 N       3493  2717  69    NA    NA   
6 Y       NA    NA    NA    1     NA   

在基地 R 你可以做

FUN <- function(x) {
  s <- strsplit(x, split=":")
  d <- as.double(sapply(s, `[`, 2))
  setNames(as.data.frame(t(d)), lapply(s, `[`, 1))
}


l <- lapply(lapply(unlist(df), function(x) el(strsplit(x, " "))), FUN)
res <- as.data.frame(t(Reduce(function(...) merge(..., all=TRUE, sort=FALSE), l)))
res
#     V1   V2   V3   V4   V5
# A   NA    7 5298   NA 5359
# C 1874 2642   NA 5366   NA
# N 3493 2717   69   NA   NA
# M   NA    1   NA   NA   NA
# Y   NA   NA   NA    1   NA
# G   NA   NA   NA   NA    8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM