R 我如何创建一个;新行“;在尝试将长链转换为CSV时使用分隔符?

R 我如何创建一个;新行“;在尝试将长链转换为CSV时使用分隔符?,r,csv,row,delimiter,R,Csv,Row,Delimiter,想象一个名为xyz的1x1矩阵 如果输出该矩阵xyz,则会显示: [1] 纽约市,19601988,洛杉矶,19621975,芝加哥,19752005 我想将其转换为一个CSV文件,其中包含3列“城市”、“开始年份”和“结束年份”,以及三行,每个城市一行。有没有办法指示下一行应该从哪里开始 我模糊地听说过像“0x0A”和“\r”这样的分隔符,但我不完全确定它们如何工作以及它们在r程序的上下文中如何工作。如果您的数据已经是这种结构,一个简单的矩阵(splitvalues,ncol=3,byrow=

想象一个名为xyz的1x1矩阵

如果输出该矩阵xyz,则会显示:

[1] 纽约市,19601988,洛杉矶,19621975,芝加哥,19752005

我想将其转换为一个CSV文件,其中包含3列“城市”、“开始年份”和“结束年份”,以及三行,每个城市一行。有没有办法指示下一行应该从哪里开始


我模糊地听说过像“0x0A”和“\r”这样的分隔符,但我不完全确定它们如何工作以及它们在r程序的上下文中如何工作。

如果您的数据已经是这种结构,一个简单的
矩阵(splitvalues,ncol=3,byrow=TRUE)
应该足以获得您想要的基本形式

例如:

xyz <- "New York City,1960,1988,Los Angeles,1962,1975,Chicago,1975,2005"
matrix(strsplit(xyz, ",", TRUE)[[1]], ncol = 3, byrow = TRUE)
#      [,1]            [,2]   [,3]  
# [1,] "New York City" "1960" "1988"
# [2,] "Los Angeles"   "1962" "1975"
# [3,] "Chicago"       "1975" "2005"

如果事情不平衡,并且您不想使用正则表达式(我很少这样做),您可以使用
gsub
strsplit
进行一些欺骗。我还从“stringi”包中包括了
stri_split
,因为它可以方便地将拆分输出转换为
矩阵

xyz <- "New York City,1960,1988,Los Angeles,1962,1975,1995,Chicago,1975,2005"
library(stringi)
stri_split_fixed(
  strsplit(
    gsub(",([A-Z])", "crazyRowDelimiter\\1", xyz), ## Make a row delimiter
    "crazyRowDelimiter", TRUE)[[1]],               ## Split on that delimiter
  ",", simplify = TRUE)                            ## Split again on commas
#      [,1]            [,2]   [,3]   [,4]  
# [1,] "New York City" "1960" "1988" ""    
# [2,] "Los Angeles"   "1962" "1975" "1995"
# [3,] "Chicago"       "1975" "2005" ""  
xyz <- "New York City,1960,1988,Los Angeles,1962,1975,1995,Chicago,1975,2005"
library(stringi)
xyzS <- strsplit(xyz, ",", TRUE)[[1]]
stri_list2matrix(split(xyzS, cumsum(grepl("[A-Za-z]", xyzS))), byrow = TRUE)
     [,1]            [,2]   [,3]   [,4]  
# [1,] "New York City" "1960" "1988" NA    
# [2,] "Los Angeles"   "1962" "1975" "1995"
# [3,] "Chicago"       "1975" "2005" NA    

用逗号分隔字符串,并将其转换为
ncol=3
byrow=TRUE
matrix
?谢谢!现在,如果数据的结构如下:“纽约市,19601988,洛杉矶,196219751995,芝加哥,19752005”,其中第1行有3列数据,第2行有4列,第3行有3列。有什么简单的方法来处理吗?或者我应该麻烦地在第1行和第2行添加一个分隔符,使其显示为:“纽约市,19601988,洛杉矶,196219751995,芝加哥,19752005”,然后执行您的方法吗?矩阵(strsplit(xyz,,,,TRUE)[[1]],ncol=4,byrow=TRUE)@DocStev,请参见我答案底部的更新。
xyz <- "New York City,1960,1988,Los Angeles,1962,1975,1995,Chicago,1975,2005"
library(stringi)
xyzS <- strsplit(xyz, ",", TRUE)[[1]]
stri_list2matrix(split(xyzS, cumsum(grepl("[A-Za-z]", xyzS))), byrow = TRUE)
     [,1]            [,2]   [,3]   [,4]  
# [1,] "New York City" "1960" "1988" NA    
# [2,] "Los Angeles"   "1962" "1975" "1995"
# [3,] "Chicago"       "1975" "2005" NA