组合成不同长度的数据帧向量,但保留顺序

时间:2016-05-12 09:54:02

标签: r vector dataframe data-cleansing data-cleaning

我有一个以下形式的字符向量:

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

我从这个向量中根据以下代码行创建了一些新的向量:

# 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 

我的目的是将所有这些向量组合起来,并按照原始向量的结构/顺序创建一个的数据框。换句话说,我想在“正确的位置”用NAs填充数据帧。所以,例如,我的数据框我想看起来像这样:

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>

有人可以帮我完成这项任务吗?

1 个答案:

答案 0 :(得分:2)

我们可以使用%(&#39; i1&#39;)创建元素的数字索引,然后将%替换为/100,评估字符串并指定输出回来。在更改的向量(&#39; vv1&#39;)上应用as.numeric将导致所有非数字的NA,同样我们可以在原始向量上执行as.integer(&#39; vv&# 39;)并获取所有非数字到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>