2010-09-27 73 views
2

我有数据的在具有值,例如一个R数据帧的列:分裂在R数据帧的列

Blue-#105 
Green-#8845 
Yellow-#5454 
Blue-#999 

我想删除的最后一个数字部分(在开始 - #),以便绘图时,Blue-#999Blue-#105被认为是同样的东西。我怎么能做到这一点?

+1

你migth检查这个问题http://stackoverflow.com/questions/3703803/apply-strsplit-rowwise/和我的答案与类似的问题,像你的链接。 – Marek 2010-09-28 06:09:30

回答

7

使用正则表达式:

> DF <- data.frame(col=c("Blue-#105", "Green-#8845", "Blue-#999")) 
> DF 
      col 
1 Blue-#105 
2 Green-#8845 
3 Blue-#999 
> DF$col <- gsub("-\\#.*", "", DF$col) 
> DF 
    col 
1 Blue 
2 Green 
3 Blue 
> 

在这里,我们说,开始-#所有字符串(其中进行转义评论焦炭#需要),并随后任何 ---这是.*在正则表达式术语:任何字符(点)重复多次,因为它适合(明星)---将被替换为空字符串,换句话说,删除。

3

使用sub或gsub函数。对于你的例子,你可以做这样的事情:

newcolors <- sub("^([^-]*)-.*$", "\\1", oldcolors) 

这假设颜色是在一个向量'oldcolors',并把结果放入新的颜色。模式从字符串(^)的开始处开始,然后匹配0或更多不是破折号的字符([^ - ] ),这些字母表示保存匹配的内容。然后它匹配一个短划线,后跟更多的字符(。),直到字符串($)结束为止,匹配的部分(整个字符串)将被替换为parens(颜色)内匹配的任何字符。

+0

嗨格雷格,我喜欢你的答案是多么的简洁,但是我得到了一个错误:在'newdatafr < - gsub(“^([^ - ] *) - 。* $”),'newdatafr是等价的到你的例子中的新颜色。 – 2010-09-27 16:02:51

+1

@Eric:那么我认为你应该复制粘贴更好。它适用于我,并且您提供的错误不会显示与Greg在此处发布的代码相同的代码。 – 2010-09-27 16:15:54

+0

FWIW我的'gsub()'调用比此处显示的'sub()'调用更短/更简洁。否则,它们当然基本上是等价的。 – 2010-09-27 18:16:02