在R中的数据帧中拆分和重命名重复的列

时间:2018-05-31 23:12:44

标签: r dataframe split dplyr

我是R的新手,正在整理数据集。我有大量的列,其中一些列(在.CSV文件中)包含几个以逗号分隔的名称。例如,我需要拆分和复制列,并为每列分别指定逗号分隔名称:

enter image description here

然而,我可能有更复杂的情况,其中有多个列(具有不同的数值)具有相同的重复多个名称。这些列应该拆分(每个名称的每一列),并且重复的名称应该加上后缀('。''或者甚至'。''如果重复多次),请看这里:

enter image description here

我正在积极探索如何做到这一点,但仍然没有运气。任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

这是一种方式:

首先,让我们使用data.table::fread

创建一些虚拟示例数据
library(data.table)    
dt = fread(
"a b c,d e f,g,h
1 2 3 4 5
1 2 3 4 5", sep=' ')
#   a b c,d e f,g,h
#1: 1 2   3 4     5
#2: 1 2   3 4     5

cols = names(dt)

现在我们使用stringr来计算名称中逗号的出现次数,并相应地添加列。我们在matrix语句中使用回收来填充具有相同值的新相邻列

library(stringr)
dt.new = dt[, lapply(cols, function(x) matrix(get(x), NROW(dt), str_count(x, ',')+1L))] 
names(dt.new) <- unlist(strsplit(cols, ','))
dt.new
#    a b c d e f g h
# 1: 1 2 3 3 4 5 5 5
# 2: 1 2 3 3 4 5 5 5

同样,如果您更喜欢使用基础data.frame而不是data.table,我们可以改为

dt.new = data.frame(lapply(cols, function(x) matrix(dt[[x]], NROW(dt), str_count(x,',')+1L)))
names(dt.new) <- unlist(strsplit(cols, ','))