【问题标题】:splitting and renaming repeated columns in data frame in R拆分和重命名R中数据框中的重复列
【发布时间】:2018-05-31 23:12:44
【问题描述】:

我对 R 非常陌生,正在整理数据集。我有大量列,其中一些列(在 .CSV 文件中)包含几个逗号分隔的名称。例如,我需要拆分和复制列,并将逗号分隔的名称分别赋予每一列:

但是,我可能有更复杂的情况,其中有几个列(具有不同的数值)具有相同的重复多个名称。这些列应该被拆分(每个名称的每一列)并且应该为重复的名称添加后缀('.1' 甚至'.2',如果它们重复更多次),请参见此处:

我正在积极探索如何做到这一点,但仍然没有运气。任何帮助将不胜感激。

【问题讨论】:

  • 请发布一个包含示例数据的最小且具有代表性的示例。如果不确定如何操作,请参阅here。这听起来像是 strsplittidyr::separate_rows 的工作。

标签: r dataframe split dplyr


【解决方案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, ','))

【讨论】:

  • 很好的答案,非常感谢,但是我在阅读 .csv 文件时仍然遇到问题。包含两个由“,”分隔的名称的列名称将转换为“。”例如:csv 文件中的“P123,Q456”将转换为“P123.Q456”。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2018-09-19
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多