2017-11-29 9 views
0

私は、次の規則を使用して名前を付けたテキストファイルのディレクトリを持っています: "Location[A-Z]_House[0-15]_Day[0_15].txt"、例はLA_H05_D14.txtです。名前を分割して要素にする方法はありますか?具体的には、場所の後ろにある[A-Z]という文字を使用したいと思います。例えば。 LB_H01_D01.txtは位置「B」になり、場所Bに属するすべてのデータは「B」とラベル付けされますか?1つのデータフレームに複数のtxtファイルをインポートし、ファイル名の一部を "id"として使用します。

私は1つのデータフレームにファイルからのすべてのデータをインポートしていますに関する問題の

head(Df) 
    id  Date  Time Timestamp PM2_5(ug/m3) AQI(US) AQI(CN) PM10(ug/m3) Outdoor AQI(US) Outdoor AQI(CN) Temperature(C) Temperature(F) 
1 1 2017/10/17 20:31:38 1508272298  102.5  175  135   512    0    0    30   86.1 
2 1 2017/10/17 20:31:48 1508272308   93.6  171  124   477    0    0    30   86.1 
3 1 2017/10/17 20:31:58 1508272318   98.0  173  129   397    0    0    30   86.0 
4 1 2017/10/17 20:32:08 1508272328   98.0  173  129   422    0    0    30   86.0 
5 1 2017/10/17 20:32:18 1508272338  104.3  176  137   466    0    0    30   86.0 
6 1 2017/10/17 20:32:28 1508272348  101.6  175  134   528    0    0    30   86.0 
    Humidity(%RH) CO2(ppm) VOC(ppb) 
1   43  466  -1 
2   43  467  -1 
3   42  468  -1 
4   42  469  -1 
5   42  471  -1 
6   42  471  -1 
+0

私はあなたが非常に意味のある「ID」列を取得していない理由はlapply' 'によって返されたリストに名前が付いていないことであると思います。あなたが 'bind_rows(setNames(lapply(l、...)、l)、.id =" id ")を使うなら、それはうまくいくはずです。その後、ファイル名の関連部分を抽出することができます。 –

+1

可能な複製:https://stackoverflow.com/q/34313895 – Jaap

+1

関連:https://stackoverflow.com/q/32888757 – Jaap

答えて

2

独立:

l = list.files(patt="txt$", full.names = T) 
library(dplyr) 

Df = bind_rows(lapply(l, function(i) {temp <- read.table(i,stringsAsFactors = FALSE,sep=";"); 
setNames(temp, c("Date","Time","Timestamp","PM2_5(ug/m3)","AQI(US)","AQI(CN)","PM10(ug/m3)","Outdoor AQI(US)","Outdoor AQI(CN)","Temperature(C)","Temperature(F)","Humidity(%RH)","CO2(ppm)","VOC(ppb)" 
))}), .id = "id") 

データは、「ID」欄で、このようになります。 id列の内容を使用すると、次のコードを使用してファイル名から情報を抽出できます。

#you may use the original filenames 
filenames <- basename(l) 
#or the content of the id column 
filenames <- as.character(Df$id) #if you have read in filenames in the Df 
#for demonstration here a definition of exemplary filenames 
filenames <- c("LA_H01_D01.txt" 
       ,"LA_H02_D02.txt" 
       ,"LD_H01_D14.txt" 
       ,"LD_H01_D15.txt") 

filenames <- gsub("_H|_D", "_", filenames) 
filenames <- gsub(".txt|^L", "", filenames) 

fileinfo <- as.data.frame(do.call(rbind, strsplit(filenames, "_"))) 
colnames(fileinfo) <- c("Location", "House", "Day") 

fileinfo[, c("House", "Day")] <- apply(fileinfo[, c("House", "Day")], 2, as.numeric) 
#  Location House Day 
# 1  A  1 1 
# 2  A  2 2 
# 3  D  1 14 
# 4  D  1 15 

#add the information to your Df as new columns 
Df <- cbind(Df, fileinfo) 

#the whole thing as a function used in your data import 
add_fileinfo <- function(df, filename) { 

    filename <- gsub("_H|_D", "_", filename) 
    filename <- gsub(".txt|^L", "", filename) 

    fileinfo <- as.data.frame(do.call(rbind, strsplit(filename, "_"))) 
    colnames(fileinfo) <- c("Location", "House", "Day") 

    fileinfo[, c("House", "Day")] <- apply(fileinfo[, c("House", "Day")], 2, as.numeric) 

    cbind(df, fileinfo[rep(seq_len(nrow(fileinfo)), each= nrow(df)),]) 

} 

Df = bind_rows(lapply(l, function(i) 
{temp <- read.table(i,stringsAsFactors = FALSE,sep=";"); 
setNames(temp, c("Date","Time","Timestamp","PM2_5(ug/m3)","AQI(US)","AQI(CN)","PM10(ug/m3)","Outdoor AQI(US)","Outdoor AQI(CN)","Temperature(C)","Temperature(F)","Humidity(%RH)","CO2(ppm)","VOC(ppb)" 
)); 
temp <- add_fileinfo(temp, i); 
} 
), .id = "id") 
+0

ありがとうございます。このファイルは "LA_H05_D14.txt"と呼ばれ、私たちはこれを分割して、ロケーションDに関連するいくつかの情報を失います。 – HCAI

+1

あなたのコメントに答えて私の答えを編集しました。これはあなたのファイル名で動作するはずです。そうでない場合は教えてください。より複雑な形式の場合は、すべてのタイプの単語と数字の組み合わせを簡単に正規表現で扱うことができます。 –

+0

OOOHこれはクールに見える! gsubは本当に強力ですね!私が今遭遇している唯一の事は、fileinfoには116行がありますが、Dfには96000があります。なぜなら、インポートした各ファイルには何百もの行があるからです。あれについてどう思う? – HCAI

1

この(一般的な)解決策のようなものがあなたを動かすはずです。

そして
mydata1 = read.csv(path1, header=T) 
mydata2 = read.csv(path2, header=T) 

、(すなわちmydata2の観測にmydata1の観測と一致することができ)、これは次のように動作する限りmydata1とmydata2が同じ名前を持つ少なくとも一つの共通の列を有するよう

myfulldata = merge(mydata1, mydata2) 

をマージ魅力。それはまた3行かかります。

観測と観測に一致させるデータがあるファイルが20個ある場合はどうなりますか?彼らはすべての一般的な列がマージを許可すると仮定すると、私はまだ(20行のコード)で20ファイルを読んで、merge()2×2の作業をする必要があります...私は19のマージステートメントこのように:

mytempdata = merge(mydata1, mydata2) 
mytempdata = merge(mytempdata, mydata3) 
. 
. 
. 
mytempdata = merge(mytempdata, mydata20) 

これは面倒です。あなたはもっと簡単な方法を探しているかもしれません。あなたがいる場合は、私が)(multmergeと呼ばれる自分の苦境を解決するための機能を書いた*ここでは関数を定義するためのコードがあります:。

multmerge = function(mypath){ 
filenames=list.files(path=mypath, full.names=TRUE) 
datalist = lapply(filenames, function(x){read.csv(file=x,header=T)}) 
Reduce(function(x,y) {merge(x,y)}, datalist) 

ここであなたを助けるべきである優れたリソースです。

https://stats.idre.ucla.edu/r/codefragments/read_multiple/

関連する問題