【问题标题】:combine into a data frame vectors of different length but preserving the order组合成不同长度但保持顺序的数据帧向量
【发布时间】:2016-05-12 09:54:02
【问题描述】:

我有一个字符向量,格式如下:

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 

我的目的是结合所有这些向量并创建一个数据框,遵循原始向量的结构/顺序。换句话说,我想在“正确的位置”用 NA 填充数据框。因此,例如,我希望我的数据框看起来像这样:

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>

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

【问题讨论】:

    标签: r vector dataframe data-cleaning


    【解决方案1】:

    我们可以用% ('i1') 创建元素的数字索引,然后用/100 替换那些具有% 的元素,评估字符串并将输出分配回去。将as.numeric 应用于已更改的向量('vv1')将导致所有非数字的 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>
    

    【讨论】:

    • 它成功了,谢谢。但是,我忘了一件事。如果原始向量也有日期,如果我想创建一个收集日期的新向量并再次组合所有向量以使数据帧像以前一样,会有什么不同?
    • 在我的数据库中,c's 和 b's 的等价物是句子,并且似乎没有收集上例中向量“字符”中的那些。
    • @msh855 如果中间有空格,你可能需要^[A-Za-z ]+$
    猜你喜欢
    • 2012-12-15
    • 2019-05-22
    • 2014-04-12
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2020-04-10
    相关资源
    最近更新 更多