【问题标题】:Within a list of vectors, convert each vector to a string then convert to dataframe in R在向量列表中,将每个向量转换为字符串,然后转换为 R 中的数据帧
【发布时间】:2018-11-24 17:43:21
【问题描述】:

我有一个向量列表 j,看起来像这样:

>j
[[1]
[1] "a" "b" "c"

[[2]]
[1] "c" "c" 

[[3]]
[1] "d" "d" "d" "a" "a" 
.
. 
. 

我想将其转换为一个数据框,该数据框有一列,每个向量内容连接在一起。所以该列看起来像:

  Column_Name
1       a b c 
2         c c 
3   d d d a a 

我尝试过使用 Replace() 函数以及我将在之后使用的循环:

for (x in 1:length(j)){ 
  j[x] = paste(j[x], collapse = " ")
}

 j <- data.frame(matrix(unlist(j), nrow=length(j), byrow=T)

任何指导将不胜感激。 谢谢你。

【问题讨论】:

    标签: r list dataframe vector


    【解决方案1】:

    正如您自己尝试过的那样,sapply 函数与 pastecollapse 参数应该将所有这些都包装到 data.frame 中:

    # Toy data
    set.seed(1)
    j <- replicate(5, rep(sample(letters, 1), sample(1:10,1)))
    print(j)
    #[[1]]
    #[1] "g" "g" "g" "g"
    #
    #[[2]]
    # [1] "o" "o" "o" "o" "o" "o" "o" "o" "o" "o"
    #
    #[[3]]
    #[1] "f" "f" "f" "f" "f" "f" "f" "f" "f"
    #
    #[[4]]
    #[1] "y" "y" "y" "y" "y" "y" "y"
    #
    #[[5]]
    #[1] "q"
    
    # Collapse each element and wrap into a data.frame
    res <- data.frame("Column_name" = sapply(j, paste, collapse = " "))
    print(res)
    #          Column_name
    #1             g g g g
    #2 o o o o o o o o o o
    #3   f f f f f f f f f
    #4       y y y y y y y
    #5                   q
    

    sapplylist 的每个元素应用paste 函数以创建串联列表元素的字符向量。 data.frame 构造函数只是将该输出转换为所需的输出。

    【讨论】:

    • data.frame(Column_name = sapply(ll,paste,collapse=" "))。不需要"Column_name"中的引号
    • @Onyambu 事实上,引号可以省略。但这也有效。这被认为是“糟糕的风格”还是“危险的”?我认为这清楚地表明该程序不会寻找一些 Column_name 对象(无论它是否存在,它都不会)。
    • 您可以将其视为一项作业。您分配给 column_name 而不是“column_name”,例如我们这样做 &gt;a=3 而不是 &gt;"a"=3
    【解决方案2】:

    一旦将name 提供给列表,然后使用stack 在data.frame 中转换列表。最后,dplyr 包用于从由 分隔的公共元素中折叠向量。

    样本数据取自@AndersEllernBilgrau的回答。

    set.seed(1)
    j <- replicate(5, rep(sample(letters, 1), sample(1:10,1)))
    
    names(j) <- seq_along(j)
    
    library(dplyr)
    stack(j) %>% group_by(ind) %>%
      summarise(Column_Name = paste0(values, collapse = " ")) %>%
      ungroup() %>% select(-ind)
    
    # # A tibble: 5 x 1
    # Column_Name        
    # <chr>              
    # 1 g g g g            
    # 2 o o o o o o o o o o
    # 3 f f f f f f f f f  
    # 4 y y y y y y y      
    # 5 q 
    # 
    

    【讨论】:

    • aggregate(.~ind,stack(setNames(j,1:length(j))),paste,collapse=" ")
    • @Onyambu 是的。非常正确。谢谢可以是另一种选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2017-08-22
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多