Read stdin into R

  • 本文关键字:into stdin Read
  • 更新时间 :
  • 英文 :


>我有一个结构如下的文件:

123
Jhon: NewYork, Boston, gainesville
Mike: LosAngeles
Almudena: Baltimore, SanDiego, Austin, Memphis
Anna: Washington, Oklahoma, Nashville, Denver, Phenix, Tucson
...

依此类推,直到 123 个名字和每人最多 50 个城市。我想将文件读入 R 中的可用表,例如,具有 123 行和 51 列(名称 + 最多 50 个城市)的表。理想的情况是,表在没有城市的地方有空格(例如,对应于只在美国两个城市的人的行将有 48 个空格。

另一个更有用的选项也是两列表(或矩阵),其中两列的形式为

Name City
Jhon NewYork
Jhon Boston
Jhon gainesville
Mike LosAngeles
...

我不太确定是否有可用的功能。但是为这个文件编写导入器并不难:

ll <- readLines("input.txt")
## keep only lines with "name: cities"
ll <- ll[grep(":", ll)]
## split at ":" to divide in name and cities
s <- strsplit(ll, ":")
## split by "," to divide cities
s <- lapply(s, function(x) {
  return(cbind(x[1], strsplit(x[2], ",")[[1]]))
})
## bind list of matrices to one matrix
m <- do.call(rbind, s)
## remove whitespace in front of the cities
m[, 2] <- gsub("^\s+", "", m[, 2])
m
#      [,1]       [,2]
# [1,] "Jhon"     "NewYork"
# [2,] "Jhon"     "Boston"
# [3,] "Jhon"     "gainesville"
# [4,] "Mike"     "LosAngeles"
# [5,] "Almudena" "Baltimore"
# [6,] "Almudena" "SanDiego"
# [7,] "Almudena" "Austin"
# [8,] "Almudena" "Memphis"
# [9,] "Anna"     "Washington"
#[10,] "Anna"     "Oklahoma"
#[11,] "Anna"     "Nashville"
#[12,] "Anna"     "Denver"
#[13,] "Anna"     "Phenix"
#[14,] "Anna"     "Tucson"

我今天正在研究这个问题,并在搜索中找到了这个旧线程。以下是我如何通过整洁来解决这个问题。

对于制表符分隔:readLines("input.txt") %>% read_tsv

对于逗号分隔:readLines("input.txt") %>% read_csv

最新更新