我正在使用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之间的行选择有更好的主意,我将很高兴看到它!
谢谢
答案 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)。