我有数据的在具有值,例如一个R数据帧的列:分裂在R数据帧的列
Blue-#105
Green-#8845
Yellow-#5454
Blue-#999
我想删除的最后一个数字部分(在开始 - #),以便绘图时,Blue-#999
和Blue-#105
被认为是同样的东西。我怎么能做到这一点?
我有数据的在具有值,例如一个R数据帧的列:分裂在R数据帧的列
Blue-#105
Green-#8845
Yellow-#5454
Blue-#999
我想删除的最后一个数字部分(在开始 - #),以便绘图时,Blue-#999
和Blue-#105
被认为是同样的东西。我怎么能做到这一点?
使用正则表达式:
> 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
>
在这里,我们说,开始-#
所有字符串(其中进行转义评论焦炭#
需要),并随后任何 ---这是.*
在正则表达式术语:任何字符(点)重复多次,因为它适合(明星)---将被替换为空字符串,换句话说,删除。
使用sub或gsub函数。对于你的例子,你可以做这样的事情:
newcolors <- sub("^([^-]*)-.*$", "\\1", oldcolors)
这假设颜色是在一个向量'oldcolors',并把结果放入新的颜色。模式从字符串(^)的开始处开始,然后匹配0或更多不是破折号的字符([^ - ] ),这些字母表示保存匹配的内容。然后它匹配一个短划线,后跟更多的字符(。),直到字符串($)结束为止,匹配的部分(整个字符串)将被替换为parens(颜色)内匹配的任何字符。
嗨格雷格,我喜欢你的答案是多么的简洁,但是我得到了一个错误:在'newdatafr < - gsub(“^([^ - ] *) - 。* $”),'newdatafr是等价的到你的例子中的新颜色。 – 2010-09-27 16:02:51
@Eric:那么我认为你应该复制粘贴更好。它适用于我,并且您提供的错误不会显示与Greg在此处发布的代码相同的代码。 – 2010-09-27 16:15:54
FWIW我的'gsub()'调用比此处显示的'sub()'调用更短/更简洁。否则,它们当然基本上是等价的。 – 2010-09-27 18:16:02
你migth检查这个问题http://stackoverflow.com/questions/3703803/apply-strsplit-rowwise/和我的答案与类似的问题,像你的链接。 – Marek 2010-09-28 06:09:30