将R中的矢量按列转换为数据帧

时间:2014-04-30 12:49:14

标签: string r vector dataframe multiple-columns

我想在每行中使用字符串转换此向量,并在一个字符串中分隔元素:

> 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

提前致谢! 的Matthias

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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在每个空格char处拆分字符串。连接为data.frame会给你一个df wih 3列。所以你必须用t转置它。为了更好的可读性,我更改了行名称。