【发布时间】:2016-05-14 04:04:33
【问题描述】:
我有一个这样的数据框:
foo=data.frame(Point.Type = c("Zero Start","Zero Start", "Zero Start", "3000rpm_10%_13barG_Sdsdsa_1.0_ss_Pww","3000rpm_10%_13barG_Sdsdsa_1.0_ss_Pww","3000rpm_10%_13barG_Sdsdsa_1.0_ss_Pww","Zero Stop","Zero Start"),
Point.Value = c(NA,NA,NA,rnorm(3),NA,NA))
我想添加三列,用分隔符_分割第一列,只保留分割后得到的数值。对于第一列不包含任何_ 的行,三个新列应为NA。我使用separate 有点接近,但这还不够:
> library(tidyr)
> bar = separate(foo,Point.Type, c("rpm_nom", "GVF_nom", "p0in_nom"), sep="_", remove = FALSE, extra="drop", fill="right")
> bar
Point.Type rpm_nom GVF_nom p0in_nom Point.Value
1 Zero Start Zero Start <NA> <NA> NA
2 Zero Start Zero Start <NA> <NA> NA
3 Zero Start Zero Start <NA> <NA> NA
4 3000rpm_10%_13barG_Sdsdsa_1.0_ss_Pww 3000rpm 10% 13barG -1.468033
5 3000rpm_10%_13barG_Sdsdsa_1.0_ss_Pww 3000rpm 10% 13barG 1.280868
6 3000rpm_10%_13barG_Sdsdsa_1.0_ss_Pww 3000rpm 10% 13barG 0.270126
7 Zero Stop Zero Stop <NA> <NA> NA
8 Zero Start Zero Start <NA> <NA> NA
我不确定为什么我的数据框现在包含两种明显不同的NA,但is.na 似乎都喜欢它们,所以我可以忍受。但是,我有两种问题:
- 新列应至少为
numeric,并且可能为integer。相反,它们是character,因为尾随rpm、%、barG。我该如何摆脱这些? - 当
Point.Type不能被拆分时,rpm_nom应该是NA,而是变成Zero Start或Zero Stop。更改fill=选项只会更改哪一列获得Zero Start/Zero Stop。相反,我希望他们三个都是NA。我该怎么做?
注意:我使用的是tidyr,但如果您认为有更好的方法,您当然不需要这样做。
【问题讨论】: