【问题标题】:Separate One Column Into Five Columns将一列分成五列
【发布时间】:2019-04-07 09:32:15
【问题描述】:

我的数据集显示了 153 个观察中的 6 个变量,全部保存在一列中,如下所示:

Ozone.Solar.R.Wind.Temp.Month.Day
1                   41,190,7.4,67,5,1
2                     36,118,8,72,5,2
3                  12,149,12.6,74,5,3
4                  18,313,11.5,62,5,4
5                   NA,NA,14.3,56,5,5

我现在正在寻找一种方法将这些变量分成 6 个不同的列,最终应该是这样的:

Ozone Solar Wind Temp Month Day
41    190   7.4  67   5     1    
36    118   8    72   5     2  
12    149   12.6 74   5     3  
18    313   11.5 62   5     4  
NA    NA    14.3 56   5     5 

提前感谢您的帮助!

【问题讨论】:

  • 请以完全可复制的形式分享您的数据。这样可以得到更好的答案。您可以使用dput() 并将结果粘贴到此处以获得该效果。
  • 对我来说,这应该在您读入文件时解决。我会做三行代码。第一个读取并分离标题。第二个 read.csv 跳过第一行并将标题设置为 FALSE。第三个将标题名称添加到生成的 data.frame 中。

标签: r dataframe multiple-columns


【解决方案1】:

我们可以在base R 中轻松做到这一点,使用read.csv

out <- read.csv(text = df[[1]], header = FALSE, col.names = scan(text = names(df), 
             what = "", sep=".", quiet = TRUE), stringsAsFactors = FALSE)
out
#  Ozone Solar Wind Temp Month Day
#1    41   190  7.4   67     5   1
#2    36   118  8.0   72     5   2
#3    12   149 12.6   74     5   3
#4    18   313 11.5   62     5   4
#5    NA    NA 14.3   56     5   5

数据

df <- structure(list(Ozone.Solar.Wind.Temp.Month.Day = c("41,190,7.4,67,5,1", 
 "36,118,8,72,5,2", "12,149,12.6,74,5,3", "18,313,11.5,62,5,4", 
 "NA,NA,14.3,56,5,5")), class = "data.frame", row.names = c("1", 
  "2", "3", "4", "5"))

【讨论】:

    【解决方案2】:

    我们可以通过以下方式使用separate,而无需对任何值进行硬编码。

    tidyr::separate(df, names(df), sep = ",", into = strsplit(names(df), "\\.")[[1]])
    
    #  Ozone Solar Wind Temp Month Day
    #1    41   190  7.4   67     5   1
    #2    36   118    8   72     5   2
    #3    12   149 12.6   74     5   3
    #4    18   313 11.5   62     5   4
    #5    NA    NA 14.3   56     5   5
    

    仅使用我们知道的基本 R 可以使用 strsplitrbind 将列表拆分为逗号,并使用 setNames 分配名称。

    setNames(do.call(rbind.data.frame, strsplit(as.character(df[[1]]), ",")), 
                     strsplit(names(df), "\\.")[[1]]) 
    

    数据

    df <- structure(list(Ozone.Solar.Wind.Temp.Month.Day = structure(c(4L, 
    3L, 1L, 2L, 5L), .Label = c("12,149,12.6,74,5,3", "18,313,11.5,62,5,4", 
    "36,118,8,72,5,2", "41,190,7.4,67,5,1", "NA,NA,14.3,56,5,5"), class = 
    "factor")), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5"))
    

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多