【问题标题】:Convert a vector in R to a dataframe by columns将 R 中的向量按列转换为数据框
【发布时间】:2014-04-30 12:49:14
【问题描述】:

我想用每一行中的字符串和空格分隔一个字符串中的元素来转换这个向量:

> v.input_red 
[1] "pm 0 100 2.1 59 70 15.5 14.8 31 984 32 0 56 55 0 0 0 0 0 0 -60 -260 0 0 6 0 0 0 0 0 20 8 2ff 0 249 0 0 "
[2] "pm 0 100 2.1 59 70 15.5 14.8 31 984 32 0 56 55 0 0 0 0 0 0 -60 -260 0 0 6 0 0 0 0 0 20 8 2ff 0 249 0 0 "
[3] "pm 0 100 2.1 59 70 15.5 14.8 31 984 32 0 56 55 0 0 0 0 0 0 -60 -260 0 0 6 0 0 0 0 0 20 8 2ff 0 249 0 0 "

到每个元素都有一列的数据框。但我不太确定如何从字符串中提取元素。我猜最好的方法是以某种方式一次转换整个东西..

想要的结果数据框(手动创建):

V1 V2  V3  V4 V5 V6   V7   V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21  V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35
1  pm  0 100 2.1 59 70 15.5 14.8 31 984  32   0  56  55   0   0   0   0   0   0 -60 -260   0   0   6   0   0   0   0   0  20   8 2ff   0 249
2  pm  0 100 2.1 59 70 15.5 14.8 31 984  32   0  56  55   0   0   0   0   0   0 -60 -260   0   0   6   0   0   0   0   0  20   8 2ff   0 249
3  pm  0 100 2.1 59 70 15.5 14.8 31 984  32   0  56  55   0   0   0   0   0   0 -60 -260   0   0   6   0   0   0   0   0  20   8 2ff   0 249

提前致谢! 马蒂亚斯

【问题讨论】:

    标签: string r vector dataframe multiple-columns


    【解决方案1】:

    很长一段时间以来,read.table 和家人都有一个text 参数,可以让您直接从字符向量中读取。无需先将对象写入文件。

    您的样本数据...

    v.input_red <- c("pm 0 100 2.1 59 70 15.5 14.8 31 984 32 0 56 55 0 0 0 0 0 0 -60 -260 0 0 6 0 0 0 0 0 20 8 2ff 0 249 0 0 ",
    "pm 0 100 2.1 59 70 15.5 14.8 31 984 32 0 56 55 0 0 0 0 0 0 -60 -260 0 0 6 0 0 0 0 0 20 8 2ff 0 249 0 0 ",
    "pm 0 100 2.1 59 70 15.5 14.8 31 984 32 0 56 55 0 0 0 0 0 0 -60 -260 0 0 6 0 0 0 0 0 20 8 2ff 0 249 0 0 ")
    

    ...直接读入:

    read.table(text = v.input_red, header = FALSE)
    #   V1 V2  V3  V4 V5 V6   V7   V8 V9 V10 V11 V12 V13 V14 V15 V16 V17
    # 1 pm  0 100 2.1 59 70 15.5 14.8 31 984  32   0  56  55   0   0   0
    # 2 pm  0 100 2.1 59 70 15.5 14.8 31 984  32   0  56  55   0   0   0
    # 3 pm  0 100 2.1 59 70 15.5 14.8 31 984  32   0  56  55   0   0   0
    #   V18 V19 V20 V21  V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33
    # 1   0   0   0 -60 -260   0   0   6   0   0   0   0   0  20   8 2ff
    # 2   0   0   0 -60 -260   0   0   6   0   0   0   0   0  20   8 2ff
    # 3   0   0   0 -60 -260   0   0   6   0   0   0   0   0  20   8 2ff
    #   V34 V35 V36 V37
    # 1   0 249   0   0
    # 2   0 249   0   0
    # 3   0 249   0   0
    

    【讨论】:

    • 很好,不知道文本参数!这是更好的答案。
    【解决方案2】:

    假设 file 是您保存在系统上的文件名:

    writeLines(v.input_red, file)
    data <- read.table(file)
    

    【讨论】:

    • 完美,这就是我想要的。非常感谢!!
    【解决方案3】:

    这个解决方案是您想要的吗?

    s1 <- "pm 0 100 2.1 59 70 15.5 14.8 31 984 32 0 56 55 0 0 0 0 0 0 -60 -260 0 0 6 0 0 0 0 0 20 8 2ff 0 249 0 0 "
    s2 <- "pm 0 100 2.1 59 70 15.5 14.8 31 984 32 0 56 55 0 0 0 0 0 0 -60 -260 0 0 6 0 0 0 0 0 20 8 2ff 0 249 0 0 "
    s3 <- "pm 0 100 2.1 59 70 15.5 14.8 31 984 32 0 56 55 0 0 0 0 0 0 -60 -260 0 0 6 0 0 0 0 0 20 8 2ff 0 249 0 0 "
    
    df <- t(data.frame(strsplit(s1, " "),strsplit(s2, " "),strsplit(s3, " ")))
    row.names(df) <- c("s1", "s2", "s3")
    

    strsplit 在每个空格字符处拆分字符串。连接为 data.frame 为您提供 3 列的 df。所以你必须用t 转置它。我更改了行名以提高可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-18
      • 2021-06-25
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2017-09-25
      相关资源
      最近更新 更多