【问题标题】:Read List excel in R & then perform operation在R中读取列表excel然后执行操作
【发布时间】:2021-08-19 07:09:59
【问题描述】:

我不确定如何在 R 中复制代码或列表,希望我的图像能够传达问题。我在 excel 中有几列(长度不均匀),我想创建一个最后一列,它从每列中获取 1 个值并创建一个列表。 (如果您可以包含有关如何从 Excel 中读取 R 中此类数据的代码,那也会很有帮助。)

添加数据结构

df <- structure(list(A = c("A1", "A2", "A3", NA, NA), B = c("B1", "B2", 
NA, NA, NA), C = c("C1", "C2", "C3", "C4", "C5"), D = c("D1", 
"D2", "D3", NA, NA)), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

    标签: r list dplyr tidyverse


    【解决方案1】:

    转置数据,转换为向量并删除NA 值。

    result <- data.frame(Final = na.omit(c(t(df))))
    result
    
    #   Final
    #1     A1
    #2     B1
    #3     C1
    #4     D1
    #5     A2
    #6     B2
    #7     C2
    #8     D2
    #9     A3
    #10    C3
    #11    D3
    #12    C4
    #13    C5
    

    【讨论】:

    • 真正的智能解决方案。谢谢!我认为这里的问题是 c() 我不知道将 c 添加到矩阵会将其转换为向量
    • 只是好奇这里是否存在一个条件,即可以从最后一列的一列中选取最多 4 个值(在这种情况下,C5 将被丢弃)那么我们将如何更改代码跨度>
    • 这需要一种不同的方法 - df1 &lt;- df %&gt;% summarise(across(.fns = ~na.omit(.x)[1:4])) 然后使用上面的答案。
    【解决方案2】:

    与 tidyr:

    library(tidyverse)
    
    df <- structure(list(A = c("A1", "A2", "A3", NA, NA), B = c("B1", "B2", 
                                                                NA, NA, NA), C = c("C1", "C2", "C3", "C4", "C5"), D = c("D1", 
                                                                                                                        "D2", "D3", NA, NA)), row.names = c(NA, -5L), class = c("tbl_df", 
                                                                                                                                                                                "tbl", "data.frame"))
    pivot_longer(df, cols = c('A', 'B', 'C', 'D')) %>% na.omit()
    #> # A tibble: 13 x 2
    #>    name  value
    #>    <chr> <chr>
    #>  1 A     A1   
    #>  2 B     B1   
    #>  3 C     C1   
    #>  4 D     D1   
    #>  5 A     A2   
    #>  6 B     B2   
    #>  7 C     C2   
    #>  8 D     D2   
    #>  9 A     A3   
    #> 10 C     C3   
    #> 11 D     D3   
    #> 12 C     C4   
    #> 13 C     C5
    

    reprex package (v2.0.0) 于 2021-06-01 创建

    【讨论】:

      【解决方案3】:

      我们可以在base R轻松做到这一点

      na.omit(stack(df)[order(c(row(df))),][1])
      

      或使用melt

      library(data.table)
      melt(data.table::transpose(setDT(df)), measure = 1:5, na.rm = TRUE)[, 2, with = FALSE]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        相关资源
        最近更新 更多