我有這樣一個數據幀:從單個列創建多個列和清理結果
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
,但當然如果您認爲有更好的方法可以做到這一點,您當然不需要。
@Jaap聽起來不錯!是否可以通過使用'%>%'來避免創建'bar'? – DeltaIV
@DavidArenburg你的解決方案看起來不錯,但data.table是什麼?我所有的代碼都適用於data.frames。我擔心切換到這些數據表可能會影響我的其他代碼。此外,我不知道函數'tstrsplit',但我想這是'data.table'包中記錄。 – DeltaIV
@DeltaIV更新了答案。 'data.table'是'data.frame'的增強形式。有關更多信息,請參閱[此網頁](https://github.com/Rdatatable/data.table/wiki)。 – Jaap