3

このデータをテキストまたはdatファイルからRにインポートするのを手伝ってくれる人がいます。スペースで区切られていますが、都市名を 2 つの名前と見なすべきではありません。ニューヨークのように。

1 NEW YORK  7,262,700
2 LOS ANGELES  3,259,340
3 CHICAGO  3,009,530
4 HOUSTON  1,728,910
5 PHILADELPHIA  1,642,900
6 DETROIT  1,086,220
7 SAN DIEGO  1,015,190
8 DALLAS  1,003,520
9 SAN ANTONIO  914,350
10 PHOENIX  894,070
4

3 に答える 3

4

真のスペースが大文字の間にのみ存在する特定のデータ フレームでは、正規表現の使用を検討してください。

gsub("(*[A-Z]) ([A-Z]+)", "\\1-\\2", "1 NEW YORK  7,262,700")
# [1] "1 NEW-YORK 7,262,700"
gsub("(*[A-Z]) ([A-Z]+)", "\\1-\\2", "3 CHICAGO  3,009,530")
# [1] "3 CHICAGO  3,009,530"

その後、スペースをフィールド区切り記号として解釈できます。

于 2013-09-22T07:42:31.680 に答える
4

テーマのバリエーション...しかし、最初に、いくつかのサンプルデータ:

cat("1 NEW YORK  7,262,700",
    "2 LOS ANGELES  3,259,340",
    "3 CHICAGO  3,009,530",
    "4 HOUSTON  1,728,910",
    "5 PHILADELPHIA  1,642,900",
    "6 DETROIT  1,086,220",
    "7 SAN DIEGO  1,015,190",
    "8 DALLAS  1,003,520",
    "9 SAN ANTONIO  914,350",
    "10 PHOENIX  894,070", sep = "\n", file = "test.txt")

ステップ 1 : データを読み込むreadLines

x <- readLines("test.txt")

ステップ 2 : 区切り記号の挿入に使用できる正規表現を見つけます。ここで、パターンは (行末から見ると) 数字とコンマのセットのように見え、その前にスペースがあり、その前にすべて大文字の単語が続きます。これらのグループをキャプチャして、いくつかの「タブ」区切り文字 (\t) を挿入できます。余分なスラッシュは、それらを適切にエスケープするためのものです。

gsub("([A-Z ]+)(\\s?[0-9,]+$)", "\\\t\\1\\\t\\2", x)
#  [1] "1\t NEW YORK  \t7,262,700"     "2\t LOS ANGELES  \t3,259,340" 
#  [3] "3\t CHICAGO  \t3,009,530"      "4\t HOUSTON  \t1,728,910"     
#  [5] "5\t PHILADELPHIA  \t1,642,900" "6\t DETROIT  \t1,086,220"     
#  [7] "7\t SAN DIEGO  \t1,015,190"    "8\t DALLAS  \t1,003,520"      
#  [9] "9\t SAN ANTONIO  \t914,350"    "10\t PHOENIX  \t894,070"  

ステップ 3 :gsubが機能していることはわかってread.delimおり、 にはtextの代わりに使用できる " " 引数があることがの結果に対して直接file使用できます。read.delimgsub

out <- read.delim(text = gsub("([A-Z ]+)(\\s?[0-9,]+$)", "\\\t\\1\\\t\\2", x), 
                  header = FALSE, strip.white = TRUE)
out
#    V1           V2        V3
# 1   1     NEW YORK 7,262,700
# 2   2  LOS ANGELES 3,259,340
# 3   3      CHICAGO 3,009,530
# 4   4      HOUSTON 1,728,910
# 5   5 PHILADELPHIA 1,642,900
# 6   6      DETROIT 1,086,220
# 7   7    SAN DIEGO 1,015,190
# 8   8       DALLAS 1,003,520
# 9   9  SAN ANTONIO   914,350
# 10 10      PHOENIX   894,070

考えられる最後の手順の 1 つは、3 番目の列を数値に変換することです。

out$V3 <- as.numeric(gsub(",", "", out$V3))
于 2013-09-22T14:50:34.747 に答える
1

@Hughの回答を拡張すると、特に効率的ではありませんが、次のことを試してみます。

lines <- scan("cities.txt", sep="\n", what="character")
lines <- unlist(lapply(lines, function(x) { 
  gsub(pattern="(*[a-zA-Z]) ([a-zA-Z]+)", replacement="\\1-\\2", x) 
}))

citiesDF <- data.frame(num  = rep(0, length(lines)), 
                       city = rep("", length(lines)), 
                       population = rep(0, length(lines)),
                       stringsAsFactors=FALSE)

for (i in 1:length(lines)) {
   splitted = strsplit(lines[i], " +")
   citiesDF[i, "num"] <- as.numeric(splitted[[1]][1])
   citiesDF[i, "city"] <- gsub("-", " ", splitted[[1]][2])
   citiesDF[i, "population"] <- as.numeric(gsub(",", "", splitted[[1]][3]))
}
于 2013-09-22T08:00:33.520 に答える