【问题标题】:R - concatenate/copy row to last non-empty column of previous rowR - 将行连接/复制到上一行的最后一个非空列
【发布时间】:2020-07-25 03:44:35
【问题描述】:

获取这个样本数据:

df <- data.frame(id=c("1","2","3","7", "8"),
                 fruit=c("Appl","e","t","Banan","a"),
                 veg=c(NA,"Carro","Dog","","Kale"),
                 animal=c("",NA,NA,NA,"Cat")) 

id   fruit    veg      animal
1    Appl     <NA>     <blank>
2    e        Carro    <NA>
3    t        Dog      <NA>   
7    Banan    <blank>  <NA>
8    a        Kale     Cat      

我想编写一个脚本来检查第 x 行的 id 值是否与第 x 行 -1 连续,如果是,则将第 x 行的第一列连接到最后一个非空、非 NA 行第 x-1 行,然后复制其余列,使其看起来像这样:

id   fruit    veg      animal
1    Apple    Carrot   Dog
2    <Blank>  <Blank>  <Blank>
3    <Blank>  <Blank>  <Blank>   
7    Banana   Kale     Cat
8    <Blank>  <Blank>  <Blank>  

提前致谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我认为这将满足您的需求。

    df[is.na(df)] = ""
    i = 1
    while (i < nrow(df) - 1) {
        if (as.numeric(df[i, 1]) + 1 == as.numeric(df[i+1, 1])) {
            j = 4
            while (df[i, j] == "") j = j - 1
            k = 2
            while (df[i+1, k] == "") k = k + 1
            df[i, j] = paste(df[i, j], df[i+1, k], sep="")
            while (j < ncol(df)) {
                j = j + 1
                k = k + 1
                df[i, j] = df[i+1, k]
            }
            df[i, 1] = df[i+1, 1]
            df = df[-(i+1), ]
        } else {
            i = i + 1
        }
    }
    

    可能效率不高,因为它会迭代所有行。取决于您在数据集中有多少行。

    【讨论】:

    • 谢谢!我不得不将您的代码稍微修改为 ``` while (i
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2021-10-08
    • 1970-01-01
    • 2020-04-02
    相关资源
    最近更新 更多