r - 如何折叠列表中的值以允许将数据框中的列表列转换为向量?
问题描述
我有一个数据框,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"
)。
解决方案
我们可以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 = ',')
推荐阅读
- mongodb - mongodb aggregate lookup with a query
- css - 用于桌面和移动屏幕尺寸的不同横幅图像
- reactjs - 无效的钩子调用调用函数组件
- primeng - PrimeNG拖放不工作不添加样式类ui-helper-clearfix
- html - 如何显示禁用的物化按钮的工具提示
- python - 如何在 selenium 和 pytest (python) 中访问日期选择器
- javascript - Joi:如何验证数组中的所有项目具有相同的类型
- php - 检查是否有任何中间件在 laravel 中授予访问权限
- python - 添加自定义图例
- c# - Html Css 样式规则