.txt中数据集的R操作

时间:2019-04-01 11:39:20

标签: r database list

我正在使用R导入.txt

my_data<-read.delim("data",as.is=1)

我有一个包含3000个列表的数据框。

线条看起来像这样

Hello world !
C ID equipement
A 
3 5 6 45
123 567 762 
876 7889 986
B  
bye world

这就是我要处理的此导入文件。

1 /仅在以“ A”开头的行和以“ B”开头的行之间选择行。如果我下载另一个.txt

,则这些行的位置可以更改

2 /从列表中选择以“ C”开头的ID设备,并将值添加到A和B之间的所有列表中,并使用分隔符“”

要获取A和B之间的清单,我这样做:

id1 <- (which(my_data=="A")+1)
id2<- (which(my_data=="B")-1)
d<- my_data[id1:id2,1]
ll <- strsplit(d," ")

ll是列表的向量,例如ll[1]= "3 5 6 45"

现在我想将ID设备添加到所有这些列表中。

任何想法该怎么做? 另外,如果有人对我在A和B之间的行选择有更好的主意,我将很高兴看到它!

谢谢

1 个答案:

答案 0 :(得分:1)

要提取A和B之间的线,您可以简单地使用startsWith,例如

# Your data
# This is the structure obtained using "readLines"
my_data <- c("Hello world !", "C ID equipement", "A ", "3 5 6 45", "123 567 762 ", 
             "876 7889 986", "B  ", "bye world")


strsplit(my_data[(which(startsWith(my_data, "A")) + 1L):(which(startsWith(my_data, "B")) - 1L)], " ")
# [[1]]
# [1] "3"  "5"  "6"  "45"
# 
# [[2]]
# [1] "123" "567" "762"
# 
# [[3]]
# [1] "876"  "7889" "986" 

要获取ID,您可以使用正则表达式,例如

pat <- "^C\\s+(.*?)\\s+.*"   # Expression starts with a "C", then space, then something, then space, then something
gsub(pat, "\\1", grep(pat, my_data, value = TRUE))
# [1] "ID"

最后,要添加ID,一种非常简单的方法是使用lapply,例如

lapply(l, function(x, ID) as.numeric(x) + ID, ID = 1L)
# [[1]]
# [1]  4  6  7 46
# 
# [[2]]
# [1] 124 568 763
# 
# [[3]]
# [1]  877 7890  987

其中l表示上面的列表,ID设置为1出于演示目的(因为在该示例中没有实际的ID)。