2016-05-12 19 views
1

我有一個字符向量的順序,:組合成不同長度的數據幀矢量但保持以下形式的

vv<-c(1,2,"c", "2%", 3, "b", "4%") # original vector 

從這個矢量I創建根據下面的代碼行了一些新的載體:

# original vector  
vv<-c(1,2,"c", "2%", 3, "b", "4%") 

# vector without the characters , i.e the c and b 
vv1<-vv[-grep("[a-zA-Z]", vv)]     

# Steps to create the vector of "integers" 
strip_percents <- as.numeric(gsub("%", "", vv1))  
no_percents <- as.numeric(vv1[-grep("%", vv1)])  

# Vector that collects the strings 
strings_vv1 <- vv[grep("[a-zA-Z]", vv)]   


# Vector the collects the percentage numbers 
perce_vv1 <-vv1[grep("%", vv1)] 
perce_vv1 <- as.numeric(gsub("%", "", perce_vv1))/100 

我的目的是所有這些載體組合和創建一個數據幀,但以下原載體的結構/順序。換句話說,我想用「合適的地方」填充數據框。所以,例如,我的數據框我想看起來像這樣:

df<-data.frame(original=vv, numerics=c(1,2,NA,0.02,3,NA,0.04), integers=c(1,2,NA,NA,3,NA,NA), characters=c(NA,NA,"c",NA,NA,"b",NA)) 



original numerics integers characters 
1  1  1.00  1  <NA> 
2  2  2.00  2  <NA> 
3  c  NA  NA   c 
4  2%  0.02  NA  <NA> 
5  3  3.00  3  <NA> 
6  b  NA  NA   b 
7  4%  0.04  NA  <NA> 

有人可以幫我完成這個任務嗎?

回答

2

我們可以用%('i1')創建元素的數字索引,然後用%替換%的元素,計算字符串並將輸出分配回去。在變化的矢量('vv1')上應用as.numeric將導致所有非數字的NA,類似地,我們可以對原始矢量('vv')執行as.integer,並將所有非數字都變爲NA。帶有字母的元素可以用grepl標識,並使用ifelse將所有其他元素轉換爲NA。

vv1 <- vv 
i1 <- grep("%", vv) 
library(gsubfn) 
vv1[i1] <- sapply(gsubfn(".", list(`%`="/100"), vv[i1]), function(x) eval(parse(text=x))) 
vv1 <- as.numeric(vv1) 
vv2 <- as.integer(vv) 
vv3 <- ifelse(grepl("^[A-Za-z]+$", vv), vv, NA) 
data.frame(original=vv, numerics=vv1, integer=vv2, characters=vv3) 
# original numerics integer characters 
#1  1  1.00  1  <NA> 
#2  2  2.00  2  <NA> 
#3  c  NA  NA   c 
#4  2%  0.02  NA  <NA> 
#5  3  3.00  3  <NA> 
#6  b  NA  NA   b 
#7  4%  0.04  NA  <NA> 
+0

它的工作表示感謝。但是,我忘了一些東西。如果原始矢量也有日期,如果我想創建一個收集日期的新矢量並再次組合所有矢量以構建數據框,那麼會有什麼不同? – msh855

+0

在我的數據庫中,c和b的等價物是句子,似乎並沒有收集到上面例子中的矢量「字符」。 – msh855

+0

@ msh855如果兩者之間有空格,您可能需要'^ [A-Za-z] + $' – akrun