【问题标题】:Divide vector with grouping vector将向量与分组向量相除
【发布时间】:2015-03-10 11:11:24
【问题描述】:

我有两个向量,我想将它们组合到一个数据帧中。向量之一values 需要分成两列。第二个向量nc 告知每个观察值的数量。如果nc 为1,则values 中仅给出一个值(进入val1),999 将写入第二列(val2)。

划分向量value 并填充df 的两列的r-ish 方法是什么?我怀疑我错过了一些非常明显的东西,但目前无法继续...非常感谢!

set.seed(123)
nc <- sample(1:2, 10, replace = TRUE)
value <- sample(1:6, sum(nc), replace = TRUE)



# result by hand
df <- data.frame(nc = nc, 
               val1 = c(6, 3, 4, 1, 2, 2, 6, 5, 6, 5), 
               val2 = c(999, 5, 999, 6, 1, 999, 6, 4, 4, 999))  

【问题讨论】:

  • 谢谢@lukeA。这正是我的问题。
  • "如果 nc 为 1,则 values 中只给出一个值(进入 val1),999 将写入第二列(val2)。" df$val2 &lt;- ifelse(df$nc == 1, 999, df$val2)df$val1 &lt;- ifelse(df$nc == 1, df$nc, df$val1)?
  • 不,我认为这行不通:如果,例如nc[1] == 2 那么你需要从value 中选择前两个值,例如nc[1] == 1 然后只有来自value 的第一个值。我认为,要找出一个值属于哪个观察值,需要遍历整个列表。
  • 为了明确您的需求,请将具有预期输出的数据框添加到您的帖子中。

标签: r vector dataframe


【解决方案1】:

这是一种基于this answer的方法:

set.seed(123)
nc <- sample(1:2, 10, replace = TRUE)
value <- sample(1:6, sum(nc), replace = TRUE)

splitUsing <- function(x, pos) {
    unname(split(x, cumsum(seq_along(x) %in% cumsum(replace(pos, 1, pos[1] + 1)))))
}

combineValues <- function(vals, nums) {
    mydf <- data.frame(cbind(nums, do.call(rbind, splitUsing(vals, nums))))
    mydf$V3[mydf$nums == 1] <- 999
    return(mydf)
}

df <- combineValues(value, nc)

【讨论】:

    【解决方案2】:

    我认为这就是您要寻找的。我不确定这是最快的方法,但它应该可以解决问题。

    count <- 0
    for (i in 1:length(nc)) {
        count <- count + nc[i]
        if(nc[i]==1) {
            df$val1[i] <- value[count]
            df$val2[i] <- 999
        } else {
            df$val1[i] <- value[count-1]
            df$val2[i] <- value[count]
        }
    }
    

    【讨论】:

    • 虽然这段代码可能确实返回了正确的结果,但它肯定不是“r-ish方式”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    相关资源
    最近更新 更多