【问题标题】:Replace values in dataframe of rows and columns from vectors从向量中替换行和列数据框中的值
【发布时间】:2020-11-09 16:59:38
【问题描述】:

我有一个带零的数据框:

    2015 2016 2017 2018
1     0    0    0    0 
2     0    0    0    0
3     0    0    0    0
4     0    0    0    0

我还有两个向量:1, 3, 3, 3(行号)和2015, 2016, 2016, 2018(列名)。我想增加(+1)这些特定行号和列名([1,2015]、[3,2016]、[3,2016]、[3,2018])的值,以获得如下结果:

    2015 2016 2017 2018
1     1    0    0    0 
2     0    0    0    0
3     0    2    0    1
4     0    0    0    0

【问题讨论】:

    标签: r dataframe vector


    【解决方案1】:

    这是一个矢量化选项

    m1 <- cbind(vec1, match(vec2, names(df)))
    v1 <- ave(rep(1, length(vec1)), m1[,1], m1[,2], FUN = sum)
    i1 <- !duplicated(m1)
    df[m1[i1,]] <- v1[i1]
    

    -输出

    df
    #  2015 2016 2017 2018
    #1    1    0    0    0
    #2    0    0    0    0
    #3    0    2    0    1
    #4    0    0    0    0
    

    数据

    df <- data.frame(rep(0,4),rep(0,4),rep(0,4),rep(0,4))
    colnames(df) <- 2015:2018
    
    vec1 <- c(1,3,3,3)
    vec2 <- c(2015,2016,2016,2018)
    

    【讨论】:

      【解决方案2】:
      for(i in 1:length(vec1){
        df[vec1[i],paste(vec2[i])] = df[vec1[i],paste(vec2[i])] + 1
      }
      

      您需要将列名向量作为字符传递,否则它将解释为第 2015 列,这就是 paste()

      虚拟数据:

      df = data.frame(rep(0,4),rep(0,4),rep(0,4),rep(0,4))
      colnames(df) = 2015:2018
      
      vec1 = c(1,3,3,3)
      vec2 = c(2015,2016,2016,2018)
      

      【讨论】:

        【解决方案3】:

        您可以尝试这样的蛮力方法。

        #Create your data.frame
        d=data.frame(matrix(0,ncol=4,nrow=4))
        dimnames(d)=list( 1:4,2015:2018)
        
        #Create your two vectors, note that the column names are characters
        r=c(1,3,3,3)
        cl=as.character(c(2015,2016,2016,2018))
        
        #Loop through the vectors, locate each position in the data.frame and increment by 1
        for(i in 1:length(r)){
          d[r[i],cl[i]] = d[r[i],cl[i]]+1
        }
        
        d
        

        `

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-15
          • 1970-01-01
          • 2015-09-07
          • 1970-01-01
          • 2014-11-12
          • 2018-01-31
          • 1970-01-01
          相关资源
          最近更新 更多