如何将不同长度的字符串向量放入数据帧

JKF*_*Y13 2 r dataframe

我有一个长向量要放入R的数据框中。这是一个示例

vector<-c("1","John Doe","15%","2","Janet Doe","13%","3","Jack William Doe","10%") 
Run Code Online (Sandbox Code Playgroud)

我想要一个看起来像这样的输出

    Position      Names       Percentage
1        1         John Doe        15%
2        2        Janet Doe        13%
3        3 Jack William Doe        10%
Run Code Online (Sandbox Code Playgroud)

我知道解决方案将涉及data.frame(),可能还涉及strsplit(),但稍后将拆分长度可变的名称。

akr*_*run 5

一个选项是转换为matrix,方法是指定列数(ncol),转换为data.frame,然后使用type.convert

out <- as.data.frame(matrix(vector, ncol = 3, byrow = TRUE, 
      dimnames = list(NULL, c("Position", "Names", "Percentage"))), 
          stringsAsFactors = FALSE)
out[] <- lapply(out, type.convert, as.is = TRUE)
out
#  Position            Names Percentage
#1        1         John Doe        15%
#2        2        Janet Doe        13%
#3        3 Jack William Doe        10%
Run Code Online (Sandbox Code Playgroud)

正如@nicola在评论中提到的那样,type.convert还为data.frame最新R版本引入了方法(已检入R 3.6.0)。因此,最后一行可以更改为

out <- type.convert(out, as.is = TRUE)
Run Code Online (Sandbox Code Playgroud)

或者另一个选择是read.csv/read.table在将“ vector”折叠为单个字符串后使用

read.csv(text= gsub("(([^,]+,){2}[^,]+),", "\\1\n",toString(vector)), 
    header = FALSE, stringsAsFactors = FALSE, col.names = c("Position", 
    "Names", "Percentage"), strip.white = TRUE)
#  Position            Names Percentage
#1        1         John Doe        15%
#2        2        Janet Doe        13%
#3        3 Jack William Doe        10%
Run Code Online (Sandbox Code Playgroud)

这将确保类型根据值进行相应的转换,而不是以后进行转换

  • R的最新版本还为data.frames提供了type.convert方法,因此type.convert(out,as.is = TRUE)可以正常工作。 (3认同)