【问题标题】:how to set assignement to fill subset by row如何设置分配以逐行填充子集
【发布时间】:2015-07-22 08:56:32
【问题描述】:

在清理数据框时,我发现对子集的分配是按列而不是按行进行的,但在进行数据集清理时会出现不幸的结果,因为您通常会搜索问题案例,然后在多行中应用您的更正。

# example table
releves <- structure(list(cult2015 = c("bp", "bp"), prec2015 = c("?", "?"
)), .Names = c("cult2015", "prec2015"), row.names = c(478L, 492L
), class = "data.frame")

# assignement to a subset
iBad2 <- which(releves$cult2015 == "bp" & releves$prec2015 == "?")
releves[iBad2,c("cult2015","prec2015")] <- c("b","p")

我知道矩阵的“填充”是按列完成的,因此,提供的向量的重复是在每一列上完成的,但是是否有任何选项可以获得:每行上的“b”、“p”和不是:

> releves
    cult2015 prec2015
478        b        b
492        p        p

【问题讨论】:

  • 也许您可以 rep(c("b","p"), each = length(iBad2)) 但这可能需要更多思考才能扩展到一般情况以防万一。

标签: r subset assign


【解决方案1】:

至少在我遇到的情况下,我编写了以下函数来完成这项工作:

# allows to to assigment of newVals to a subset spanning over multiple rows
AssignToSubsetByRow <- function(dat,rows,cols,newVals){
    if(is.null(dim(newVals))&length(rows)*length(cols)> length(newVals)){
        fullRep <- rep(newVals,each=length(rows))
    }else{
        fullRep <- newVals
    }
    dat[rows,cols] <- fullRep
    return(dat)
}

并且做得很好:

releves <- AssignToSubsetByRow(releves,iBad2,c("cult2015","prec2015"),c("b","p"))

> releves
    cult2015 prec2015
478        b        p
492        b        p

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多