我的意见是:
"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`
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助R或Linux吗?
假设这个输入:
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'
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)
赠送:
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
Run Code Online (Sandbox Code Playgroud)
2) 这个替代方案也使用扫描而不是使用扫描what,list我们将自己重塑为矩阵,将其转换为data.frame并将最后4列数字化.如果您的输入实际来自文件替换textConnection(s)为"myfile.txt"之类的内容.请注意,第一行代码中的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)
Run Code Online (Sandbox Code Playgroud)
赠送:
> 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
Run Code Online (Sandbox Code Playgroud)
3) 这是另一种方法.我们读入数据,选出表示第一个结果列的数据,然后选择第二个结果列,然后重新读取它,将双引号设置为注释字符,以便省略输入的名称行.
L <- readLines(textConnection(s))
data.frame(Name1 = L[c(TRUE, FALSE, FALSE)], Name2 = L[c(FALSE, TRUE, FALSE)],
read.table(text = L, comment = '"'))
Run Code Online (Sandbox Code Playgroud)
赠送:
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
Run Code Online (Sandbox Code Playgroud)
更新 添加了其他解决方案,进行了一些小的改进并添加了说明.