2015-09-05 32 views
-2

我从Excel工作表的一列中提取了1000多行字符串。数据如下(3行):使用R将字符串转换为data.frame

鸡(31%);鸭(16%);野鸭(14%);土耳其(10%);鸽子(4%);鹅(4% );野生鸟类(4%);树麻雀(2%)

麻雀(2%)

鸡(1%)

我需要把数据插入到表(此例如:8列x 3行)。谁能帮忙?

x <- c("Chicken(31%);Duck(16%);Wild duck(14%);Turkey(10%);Pigeon(4%);Goose(4%);Wild bird(4%);Tree sparrow(2%)", 
"Tree sparrow(2%)", "Chicken(1%)") 
+0

你试过了什么?分号是列的分隔符吗?如果一行少于8个条目,你想填写什么值? – dd3

回答

1

这里有一个可能的解决方案:

library(qdapTools) 
mtabulate(strsplit(gsub("\\(\\d+%\\)", "", x), ";")) 



## Chicken Duck Goose Pigeon Tree sparrow Turkey Wild bird Wild duck 
## 1  1 1  1  1   1  1   1   1 
## 2  0 0  0  0   1  0   0   0 
## 3  1 0  0  0   0  0   0   0 
2

则很可能是更简洁的方式,但你可以尝试这样的事:

library(stringi) 
library(data.table) 

# Drop empty lines if any 
txt <- Filter(function(x) !stri_isempty(stri_trim(x)), x) 
# Extract matches 
matches <- stri_match_all_regex(txt, "([\\w\\s]+)\\(([1-9]+)%\\);?") 

matches[[1]] 

##  [,1]    [,2]   [,3] 
## [1,] "Chicken(31%);" "Chicken"  "31" 
## [2,] "Duck(16%);"  "Duck"   "16" 
## [3,] "Wild duck(14%);" "Wild duck" "14" 
## [4,] "Pigeon(4%);"  "Pigeon"  "4" 
## [5,] "Goose(4%);"  "Goose"  "4" 
## [6,] "Wild bird(4%);" "Wild bird" "4" 
## [7,] "Tree sparrow(2%)" "Tree sparrow" "2" 

# Rearrange 
rows <- lapply(
    matches, 
    function(x) setNames(as.list(as.numeric(x[, 3])), x[, 2])) 

rbindlist(rows, fill=TRUE) 

## Chicken Duck Wild duck Pigeon Goose Wild bird Tree sparrow 
## 1:  31 16  14  4  4   4   2 
## 2:  NA NA  NA  NA NA  NA   2 
## 3:  1 NA  NA  NA NA  NA   NA 

正则表达式的解释

([\\w\\s]+) # At least one word character or whitespace *, 1st group 
\\(# Left parenthesis 
([1-9]+) # At least one digit. You can replace + with {1,2}, 2nd group 
% # Percent sign 
\\) # Right parenthesis 
;? # Optional semicolon 

*可能是\\w[\\w\\s]+

+0

噢,这很有道理 –

+0

非常感谢Tyler Rinker和zero323的指导。 Zero323的代码正是我想要做的。谢谢你们俩! – Rbeginner

+0

是否可以解释正则表达式([\\ w \\ s] +)\\(([1-9] +)%\\)?详情?我调整你的代码,但是在我的输出的所有列表中获得NA。非常感谢! – Rbeginner