【问题标题】:Reshape from unconstructed dataset in r从 r 中未构造的数据集重塑
【发布时间】:2022-09-22 22:35:53
【问题描述】:

我试图通过切换一些单元格信息来重塑数据集。这是我的示例数据集的样子。

data <- data.frame(var1 = c(\"Text\",\"A\",\"B\",\"C\",\"D\"),
                   var2 = c(\"Text\",NA, 1,0,1),
                   var3 = c(\"112\",NA,NA,NA,NA),
                   var4 = c(\"Text\",1,0,NA, NA),
                   var5 = c(113,NA,NA,NA,NA))
> data
  var1 var2 var3 var4 var5
1 Text Text  112 Text  113
2    A <NA> <NA>    1   NA
3    B    1 <NA>    0   NA
4    C    0 <NA> <NA>   NA
5    D    1 <NA> <NA>   NA

它需要先清理一下。var1item 信息。 var2var4 有分数信息。 var3var5 在第一行有 id 信息。 我将需要重塑这个数据集,如下所示。

> data.1
   id  A B  C  D
1 112 NA 1  0  1
2 113  1 0 NA NA

考虑到具有相同模式的多列中的此数据文件(例如,具有更多列 var6、var7、var8、var9 等),如何重塑为所需的数据集?

    标签: r reshape


    【解决方案1】:

    这与我昨天的回答没有太大区别,但这会给你你要求的结果。将第一行移到一列上,使 id 与所需值位于同一列,删除不必要的列,然后将第一行设为列名。添加一些枢轴,然后它应该大致是您需要的:

    data <- data.frame(var1 = c("Text","A","B","C","D"), var2 = c("Text",NA, 1,0,1), var3 = c("112",NA,NA,NA,NA), var4 = c("Text",1,0,NA, NA), var5 = c(113,NA,NA,NA,NA))
    
    library(dplyr)
    library(tidyr)
    
    data2<-data%>%
      mutate_all(as.character) #Making character to avoid factor issues
    
    data2[1, 2:(ncol(data2) - 1)] <- data2[1, 3:ncol(data2)] #Shifting first row over one column
    
    data3<-data2%>%
      select(-var3,-var5) #Removing the uneeded columns
    
    colnames(data3) <- data3[1,] #Taking the first row and making it the column names
    data3 <- data3[-1, ] #removing row 1, since it was made into column names
    
    
    data3%>%
      tidyr::pivot_longer(-Text, names_to = "id", values_to = "time")%>% #Making the data into longer format
      tidyr::pivot_wider(names_from = Text, values_from = time) #Then back into wide
    

    【讨论】:

    • 我怎样才能自动化这部分? data3&lt;-data2%&gt;% select(-var3,-var5) #Removing the unneeded columns 因为会有多个不必要的列。
    【解决方案2】:
    library(dplyr)
    library(tidyr)
    
    #First rename the columns to more appropriate
    n = 2 #Number of pairs of columns you have (here 2)
    nam <- do.call(paste0, (expand.grid(c("n_", "id_"), seq(n))))
    colnames(data) <- c("col", name)
    
    #Then, the data manipulation
    data %>% 
      fill(starts_with("id")) %>% 
      mutate(across(starts_with("id"), as.numeric)) %>% 
      slice(-1) %>% 
      pivot_longer(-col, names_to = c(".value", "rn"), names_sep = "_") %>% 
      pivot_wider(names_from = "col", values_from = 'n') %>% 
      select(-rn)
    
    # A tibble: 2 × 5
         id A     B     C     D    
    1   112 NA    1     0     1    
    2   113 1     0     NA    NA   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多