2013-08-30 38 views
2

在R,我有以下数据框:通过用“。”分隔的字符的正则表达式分割数据帧列。

 Name  Category 
1 Beans 1.12.5 
2 Pears 5.7.9 
3 Eggs  10.6.5 

我想有如下:

 Name  Cat1 Cat2 Cat3 
1 Beans 1  12  5 
2 Pears 5  7  9 
3 Eggs  10  6  5 

理想中plyr内置了一些表情就好了

我会在我身边调查,但作为搜索这可能需要我很多时间,我只是想知道如果你们中的一些人有一些提示来执行此操作...

+2

你期望每一个项目正好有三类? –

+1

你说得对,我应该对此更加确切,有些答案会少于或多于3个类别,最少1个,最多5个! –

回答

7

我写了一个函数concat.split(一功能“家庭”,其实)我的splitstackshape包的一部分来处理这些类型的问题:

# install.packages("splitstackshape") 
library(splitstackshape) 
concat.split(mydf, "Category", ".", drop=TRUE) 
# Name Category_1 Category_2 Category_3 
# 1 Beans   1   12   5 
# 2 Pears   5   7   9 
# 3 Eggs   10   6   5 

它也很好地处理“不平衡”数据。

dat <- data.frame(Name = c("Beans", "Pears", "Eggs"), 
        Category = c("1.12.5", "5.7.9.8", "10.6.5.7.7")) 
concat.split(dat, "Category", ".", drop = TRUE) 
# Name Category_1 Category_2 Category_3 Category_4 Category_5 
# 1 Beans   1   12   5   NA   NA 
# 2 Pears   5   7   9   8   NA 
# 3 Eggs   10   6   5   7   7 

因为“长”或“熔融”数据在这些类型的情况下,往往需要,concat.split.multiple函数有一个“长”的说法太:

concat.split.multiple(dat, "Category", ".", direction = "long") 
#  Name time Category 
# 1 Beans 1  1 
# 2 Pears 1  5 
# 3 Eggs 1  10 
# 4 Beans 2  12 
# 5 Pears 2  7 
# 6 Eggs 2  6 
# 7 Beans 3  5 
# 8 Pears 3  9 
# 9 Eggs 3  5 
# 10 Beans 4  NA 
# 11 Pears 4  8 
# 12 Eggs 4  7 
# 13 Beans 5  NA 
# 14 Pears 5  NA 
# 15 Eggs 5  7 
+0

我发现它处理的是不等数值的情况。 – thelatemail

+0

很酷,因为它就像'rbind.fill' +1 –

+0

在我的新splitstackshape-concat.split.multiple-life的第一天!未来是光明的! +1 – Henrik

2

如果您有类别的数一致,那么这将工作:

#recreate your data first: 
dat <- data.frame(Name = c("Beans", "Pears", "Eggs"), Category = c("1.12.5", 
"5.7.9", "10.6.5"),stringsAsFactors=FALSE) 

spl <- strsplit(dat$Category,"\\.") 
len <- sapply(spl,length) 
dat[paste0("cat",1:max(len))] <- t(sapply(spl,as.numeric)) 

结果:

dat 
    Name Category cat1 cat2 cat3 
1 Beans 1.12.5 1 12 5 
2 Pears 5.7.9 5 7 9 
3 Eggs 10.6.5 10 6 5 

如果你有分隔值的不同数量,那么这应该占它:

#example unbalanced data 
dat <- data.frame(Name = c("Beans", "Pears", "Eggs"), Category = c("1.12.5", 
"5.7.9", "10.6.5"),stringsAsFactors=FALSE) 
dat$Category[2] <- "5.7" 

spl <- strsplit(dat$Category,"\\.") 
len <- sapply(spl,length) 
spl <- Map(function(x,y) c(x,rep(NA,max(len)-y)), spl, len) 

dat[paste0("cat",1:max(len))] <- t(sapply(spl,as.numeric)) 

结果:

Name Category cat1 cat2 cat3 
1 Beans 1.12.5 1 12 5 
2 Pears  5.7 5 7 NA 
3 Eggs 10.6.5 10 6 5 
2

的qdap封装具有colsplit2df只是这些排序情况:

#recreate your data first: 
dat <- data.frame(Name = c("Beans", "Pears", "Eggs"), Category = c("1.12.5", 
"5.7.9", "10.6.5"),stringsAsFactors=FALSE) 

library(qdap) 
colsplit2df(dat, 2, paste0("cat", 1:3)) 

## > colsplit2df(dat, 2, paste0("cat", 1:3)) 
## Name cat1 cat2 cat3 
## 1 Beans 1 12 5 
## 2 Pears 5 7 9 
## 3 Eggs 10 6 5 
相关问题