R 用分组向量划分向量

R 用分组向量划分向量,r,vector,dataframe,R,Vector,Dataframe,我有两个向量,我想合并到一个数据帧中。其中一个向量值需要分为两列。第二个矢量nc通知每个观察值的数量。如果nc为1,则在val1中的值中只给出一个值,999将写入第二列val2 什么是r-ish方法来划分向量值并填充df的两列?我想我错过了一些非常明显的事情,但目前无法继续…非常感谢 set.seed(123) nc <- sample(1:2, 10, replace = TRUE) value <- sample(1:6, sum(nc), replace = TRUE)

我有两个向量,我想合并到一个数据帧中。其中一个向量值需要分为两列。第二个矢量nc通知每个观察值的数量。如果nc为1,则在val1中的值中只给出一个值,999将写入第二列val2

什么是r-ish方法来划分向量值并填充df的两列?我想我错过了一些非常明显的事情,但目前无法继续…非常感谢

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))  

我想这就是你要找的。我不确定这是不是最快的方法,但它应该可以做到

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]
    }
}

以下是一种基于以下内容的方法:


谢谢你@lukeA。这正是我的问题。如果nc为1,则在值中只给出一个值,该值进入val1,999将写入第二列val2。df$val2不,我认为这不起作用:如果,例如nc[1]==2,则需要从值中选取前两个值,如果,例如nc[1]==1,则仅从值中选取第一个值。为了找出一个值属于哪个观察值,我认为,需要遍历整个列表。为了澄清您到底需要什么,请将带有预期输出的数据框添加到您的帖子中。尽管此代码可能返回正确的结果,但它肯定不是r-ish方式。
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)