1

我正在尝试在 R 中执行 read.table。我的数据(txt 文件)如下所示:

a b c d e
Australia 1 2 4 3 2
United States 1 2 4 2 2

阅读此表的问题是:

1) 第 1 行只有 5 个元素 (a~e),而其下方的所有行中都有 6 个元素。它应该有像“国家”这样的列名。然后,a 对应于第一个数字 1,b 对应于 2,..e 对应于 2(在澳大利亚的情况下)。如何在第一列中添加列名,以便 R 不会显示错误说“第 1 行没有 6 个元素”?

2)在美国的情况下,美国是两个词而不是一个,所以当R读取数据时,它把“州”放在第二列,而不是把“美国”读作一个元素名称。

(我的朋友建议我使用行名。有谁知道如何使用行名??)

如何解决这些问题并正确读取我的数据?

非常感谢!!

4

2 回答 2

2

这是另一种可能性。这一个将引号添加到以字符串开头的任何两个单词

x <- readLines("your.txt")
x[1] <- paste("Country", x[1])
read.table(text=sub("([A-Za-z]{2,}\\s[A-Za-z]{2,})", "'\\1'", x), header=TRUE)
#         Country a b c d e
# 1     Australia 1 2 4 3 2
# 2 United States 1 2 4 2 2

关于@akrun 关于包含两个以上单词的国家/地区的评论,我认为这会起作用:

x[4] <- 'Papua New Guinea 3 4 3 2 5'
xx <- sub("([A-Za-z]{2,}(\\s[A-Za-z]{2,})+)", "'\\1'", x)
read.table(text = xx, header = TRUE)
#            Country a b c d e
# 1        Australia 1 2 4 3 2
# 2    United States 1 2 4 2 2
# 3 Papua New Guinea 3 4 3 2 5

我还想到国家名称可能是数据框的行名称。如果是这样的话,那么你可以做

x <- readLines("your.txt")
read.table(text = sub("([A-Za-z]{2,}\\s[A-Za-z]{2,})", "'\\1'", x))
#               a b c d e
# Australia     1 2 4 3 2
# United States 1 2 4 2 2
于 2014-11-15T06:34:48.583 回答
1

假设示例数据模仿文件中的内容,我们可以使用读取它readLines,然后使用regex将其country names与其余部分分开。可以将分隔的国家名称添加为新列。

lines <- readLines('Betty2.txt')
lines
#[1] "a b c d e"               "Australia 1 2 4 3 2"    
#[3] "United States 1 2 4 2 2"

dat <-  read.table(text=c(lines[1], gsub('[A-Za-z]+\\s+', '',
                lines[-1])), header=TRUE)

在上面的代码中,我们替换了character后跟空格的元素。IE。带有 的国家名称''

i.e 

 gsub('[A-Za-z]+\\s+', '',  lines[-1])
 #[1] "1 2 4 3 2" "1 2 4 2 2"

 dat1 <- data.frame(Country= gsub(" \\d+.*", '', lines[-1]),
                               dat, stringsAsFactors=FALSE)

同样,这里我们将space后面的数字 ( \\d+) 后跟一个或多个字符.*替换为''

 gsub(" \\d+.*", '', lines[-1])
 #[1] "Australia"     "United States"


dat1
#        Country a b c d e
#1     Australia 1 2 4 3 2
#2 United States 1 2 4 2 2
于 2014-11-15T05:47:11.077 回答