如何将每三行转换为R或linux中的列

时间:2015-10-10 20:49:36

标签: r bash

我的意见是:

"name_01"
"name_02"
 0.000573033 0.001268718  0.45 6.5e-01
"name_03"
"name_04"
 0.00343343 0.0012435358  0.33 7.5e-09`

tsv中的预期输出:

"name_01"    "name_02"    0.0005    0.0019    0.45    6.5e-01
"name_03"    "name_04"    0.0034    0.0012    0.33    7.5e-09

任何人都可以在R或Linux中提供帮助吗?

1 个答案:

答案 0 :(得分:5)

假设这个输入:

s <- '"name_01"
"name_02"
 0.000573033 0.001268718  0.45 6.5e-01
"name_03"
"name_04"
 0.00343343 0.0012435358  0.33 7.5e-09'

1)使用what列表和multi.line=TRUE扫描参数读取它,生成列表L;设置其名称并转换为data.frame:

L <- scan(textConnection(s), what = list("", "", 0, 0, 0, 0), 
       multi.line = TRUE, quiet = TRUE)
names(L) <- paste0("V", seq_along(L))
do.call(data.frame, c(L, stringsAsFactors = FALSE))

,并提供:

       V1      V2          V3          V4   V5      V6
1 name_01 name_02 0.000573033 0.001268718 0.45 6.5e-01
2 name_03 name_04 0.003433430 0.001243536 0.33 7.5e-09

2)此备选方案也使用扫描但不使用whatlist,而是将自己重塑为矩阵,将其转换为data.frame并制作最后4列数字。如果您的输入实际来自一个文件,请用{“myfile.txt”替换textConnection(s)。请注意,第一行代码中的6表示要创建的列数,最后一行代码中的3:6表示要转换为数字的列号。

d <- as.data.frame(matrix(scan(textConnection(s), what = ""),, 6, byrow = TRUE),
       stringsAsFactors = FALSE)
d[3:6] <- lapply(d[3:6], as.numeric)

,并提供:

> d
       V1      V2          V3          V4   V5      V6
1 name_01 name_02 0.000573033 0.001268718 0.45 6.5e-01
2 name_03 name_04 0.003433430 0.001243536 0.33 7.5e-09

3)这是另一种方法。我们读入数据,选出表示第一个结果列的数据,然后选择第二个结果列,然后重新读取它,将双引号设置为注释字符,以便省略输入的名称行。

L <- readLines(textConnection(s))
data.frame(Name1 = L[c(TRUE, FALSE, FALSE)], Name2 = L[c(FALSE, TRUE, FALSE)],
 read.table(text = L, comment = '"'))

,并提供:

     Name1     Name2          V1          V2   V3      V4
1 "name_01" "name_02" 0.000573033 0.001268718 0.45 6.5e-01
2 "name_03" "name_04" 0.003433430 0.001243536 0.33 7.5e-09

更新添加了其他解决方案,进行了一些小改进并添加了说明。