首页 > 解决方案 > 如何折叠列表中的值以允许将数据框中的列表列转换为向量?

问题描述

我有一个数据框,df

df <- structure(list(ID = c("ID1", "ID2", "ID3"), values = list(A = "test", 
    B = c("test2", "test3"), C = "test4")), row.names = c(NA, 
-3L), class = "data.frame")

df
   ID       values
1 ID1         test
2 ID2 test2, test3
3 ID3        test4


sapply(df, class)
         ID      values 
"character"      "list" 

我正在尝试创建一个函数,它将遍历 的每一行df$values,如果长度大于一,则将值粘贴到一个字符串中。所以数据框看起来相同,但结构不同:

df
   ID       values
1 ID1         test
2 ID2 test2, test3
3 ID3        test4

dput(df)
structure(list(ID = c("ID1", "ID2", "ID3"), values = c("test", 
"test2, test3", "test4")), class = "data.frame", row.names = c(NA, 
-3L))

sapply(df, class)
         ID      values 
"character" "character"

(注意在最终结果中,两列都是字符列,而不是字符列和列表)。

我尝试制作一个函数来执行此操作,但它不起作用(并且非常混乱):

newcol <- NULL
for (i in nrow(df)) {
    row <- df$values[i] %>%
        unlist(., use.names = FALSE)

    if (length(row) == 1) {
        newcol = rbind(row, newcol)
    } else if (length(row)>1) {
        row = paste0(row[1], ", ", row[2])
        newcol = rbind(row, newcol)
    }
}
df$values <- newcol

有没有更简单的方法来做到这一点(有效),并且可以为任何大小的列表条目做到这一点?(例如,如果 df$values 的行条目是"test6", test7, test8, test9")。

标签: r

解决方案


我们可以sapply使用toString

df$values <- sapply(df$values, toString)
sapply(df, class)

#        ID      values 
#"character" "character" 

str(df)
#'data.frame':  3 obs. of  2 variables:
# $ ID    : chr  "ID1" "ID2" "ID3"
# $ values: chr  "test" "test2, test3" "test4"

toString是 的简写paste0(..., collapse = ',')

df$values <- sapply(df$values, paste0, collapse = ',')

推荐阅读