【问题标题】:Converting list with different element lengths to data frame and organizing rows with common values将具有不同元素长度的列表转换为数据框并组织具有共同值的行
【发布时间】:2018-08-07 07:49:23
【问题描述】:

我是 R 新手,刚开始使用列表。 我有一个不同长度的列表,我想将其转换为数据框。 我的列表如下所示:

List of A:  
$ reference: chr [1:20000] "13000" "5000" "23234" ...  
$ name_1 : chr [1:9000] "5000" "14523" ...  
$ name_2 : chr [1:800] "13000" "23234" ...

我想制作一个这样的数据框:

reference name_1 name_2  
13000     NA     13000  
5000      5000   NA  
23234     NA     23234

非常感谢您的帮助!我试图用 NA 填充列的其余部分,以便它们与“参考”具有相同的长度,但它仍然没有按照我想要的方式组织它!

【问题讨论】:

  • 你如何决定 NA 值的去向?我看不出 9,000 个 name_1 值应该如何与 20,000 个参考值匹配。在寻求帮助时,您应该包含一个简单的reproducible example,其中包含示例输入和所需的输出,可用于测试和验证可能的解决方案。 (str() 不如 dput() 有用)
  • 嘿!感谢您的回复。对不起,如果我没有说清楚。 name_1 和 name_2 包含不同的数字集(不连续),并且引用包含 name_1 和 name_2 中的所有唯一数字(加上其他数字)。 NA 值转到 name_1 或 name_2 中关于引用的值(如果这有意义?)。我希望这更有意义?我会记住你的建议。可重现的例子。非常感谢。

标签: r list sorting


【解决方案1】:

这样的?

A <- list()
A$reference <- c("13000","5000","23234")
A$name_1 <- c("5000","14523")
A$name_2 <- c("13000","23234")

B <- data.frame(reference = A$reference,
                name1 = ifelse(A$reference %in% A$name_1,A$reference,NA),
                name2 = ifelse(A$reference %in% A$name_2,A$reference,NA))

#   reference name1 name2
# 1     13000  <NA> 13000
# 2      5000  5000  <NA>
# 3     23234  <NA> 23234

【讨论】:

    【解决方案2】:

    如果name_1name_2 的所有值都在ref 中,那么你可以这样做:

    mapply(function(x,y){is.na(df$ref)<-!x%in%y;df$ref},df["ref"],df)
          ref <NA> <NA>
     [1,]   1    1   NA
     [2,]   2   NA    2
     [3,]   3    3   NA
     [4,]   4   NA    4
     [5,]   5    5   NA
     [6,]   6   NA    6
     [7,]   7    7   NA
     [8,]   8   NA    8
     [9,]   9    9   NA
    [10,]  10   NA   10
    [11,]  11   NA   NA
    [12,]  12   NA   NA
    [13,]  13   NA   NA
    [14,]  14   NA   NA
    [15,]  15   NA   NA
    

    数据

    df=list(ref=1:15,name1=c(1,3,5,7,9),name2=1:5*2)
    
     df
    $ref
     [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
    
    $name1
    [1] 1 3 5 7 9
    
    $name2
    [1]  2  4  6  8 10
    

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 2023-03-22
    • 2017-10-31
    • 1970-01-01
    • 2013-04-07
    • 2017-08-26
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    相关资源
    最近更新 更多