将含缺失值的不等长元素表格转换为计数矩阵
如何将带计数的字符串表格转换为包含计数的存在/缺失矩阵(R语言)
问题背景
你有一个每行元素数量不等的表格,单元格内容是带计数(1或2)的字符串(比如cat:2),需要生成一个矩阵:行是原表格的分组(A/B/C/D),列是所有出现过的动物名称,对应位置填该分组下的计数,未出现的填0。原有的0/1缺失矩阵方案无法满足需求,需要保留实际计数。
输入样本数据
df <- structure(list(V1 = c("A", "B", "C", "D"), V2 = c("cat:2", "dog:2", "horse:2", "cat:1"), V3 = c("dog:1", "mouse:2", "", "mouse:2"), V4 = c("mouse:1", "dolphin:2", "", "dolphin:2"), V5 = c("horse:2", "", "", "")), .Names = c("V1", "V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, -4L))
解决方案(使用tidyverse工具链)
我们可以通过宽格式转长格式→拆分键值对→长格式转宽格式三步实现,全程用tidyverse的函数完成:
- 首先加载必要的包:
library(tidyverse)
- 转换为长格式并拆分计数:
这一步把每行的多个动物计数拆成单独的行,同时将动物:计数的字符串拆分成两列(动物名和数值型计数),并过滤掉空单元格:
long_df <- df %>% pivot_longer(cols = -V1, names_to = "temp_col", values_to = "animal_count") %>% filter(animal_count != "") %>% separate(animal_count, into = c("animal", "count"), sep = ":", convert = TRUE)
- 转换为目标宽格式矩阵:
将动物名作为列,分组(A/B/C/D)作为行,缺失的位置用0填充:
result <- long_df %>% pivot_wider(names_from = animal, values_from = count, values_fill = 0) %>% column_to_rownames("V1") # 将A/B/C/D设为行名,更贴近目标格式
最终输出
运行上述代码后,result就是你要的矩阵:
> result cat dog mouse horse dolphin A 2 1 1 2 0 B 0 2 2 0 2 C 0 0 0 2 0 D 1 0 2 0 2
完全匹配你给出的目标输出。
内容的提问来源于stack exchange,提问作者7mood7
相关产品推荐
相关产品推荐

