【问题标题】:R add vector content to data frame indexR将矢量内容添加到数据框索引
【发布时间】:2018-08-20 11:33:22
【问题描述】:

我想将向量的内容添加到数据框中。例如,我有一个像这样的向量:

1, 2, 1, 1, 2, 4

还有一个像这样的数据框:

Name1 Name2 Name3 Name4 Name5 Name6
    3     2     2     0     3     1

我想计算出现在向量中的数字,并将该数字添加到数据框中的该列索引中,因此在此示例中,我将得到如下数据框:

Name1 Name2 Name3 Name4 Name5 Name6
    6     4     2     1     3     1

因为向量中有3个1,2个2,1个4。

我不知道我说得够不够清楚,但谢谢!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:
    df + replace(vec, 1:6, tabulate(vec, 6))
    
      Name1 Name2 Name3 Name4 Name5 Name6
    1     6     4     2     1     3     1
    

    更笼统地说,有一些解释:

    df + replace(vec, 1:dim(df)[2], tabulate(vec, dim(df)[2]))
        #replace values in vec
        #list of values to be replaced: 1:6 (since you have 6 columns)
        #replaced by the occurence of each value in vec (using tabulate with nbins ensures each value between 1 and 6 is in the replacement list, with zeroes for 3, 5 and 6)   
        #finally, add it to df
    

    数据:

    vec <- c(1, 2, 1, 1, 2, 4)
    
    df <- read.table(text = "
                     Name1 Name2 Name3 Name4 Name5 Name6
        3     2     2     0     3     1", h = T)
    

    【讨论】:

      【解决方案2】:

      如果列名与您在问题中所述的一样,则类似于:

      tb <- table(vec)
      cols <- paste0("Name", names(tb))
      df[cols] <- df[cols] + tb
      

      vec 是您的向量,df 是您的数据框。

      如果列名无关紧要,但列的索引则将 cols 替换为

      cols <- as.numeric(names(tb))
      

      【讨论】:

        【解决方案3】:

        因为向量中有3个1,2个2,1个4。

        您可以将向量转换为级别从 1 到数据中的列数的因子。然后使用table 计算出现次数并将其添加到您的数据框中。

        df + table(factor(vec, levels = 1:ncol(df)))
        #  Name1 Name2 Name3 Name4 Name5 Name6
        #1     6     4     2     1     3     1
        

        数据

        df <- structure(list(Name1 = 3L, Name2 = 2L, Name3 = 2L, Name4 = 0L, 
            Name5 = 3L, Name6 = 1L), .Names = c("Name1", "Name2", "Name3", 
        "Name4", "Name5", "Name6"), class = "data.frame", row.names = c(NA, 
        -1L))
        
        vec <- c(1, 2, 1, 1, 2, 4)
        

        【讨论】:

          【解决方案4】:

          很可能有一个函数可以做同样的事情;但是,我认为这段代码可能对你有用。

          一个向量和一个数据框的测试集,

          o<-data.frame(round(runif(5,min = 1,max = 5 )))
          q<-round(runif(5,min = 1,max = 5))
          

          这是一个循环,用于计算向量集中的数字并将数据框集的值添加到计数的数字中。

          for (i in 1:dim(o)[1]){
            j=1
            while (j<=dim(o)[1]) {
            if(i==q[j]){o[i,1]<-o[i,1]+1}
              j<-j+1
            }}
          

          【讨论】:

            【解决方案5】:

            您可以使用loop。内部使用which 来识别匹配项,使用length 来计算出现次数。

            a <- NULL
            for(i in 1:length(v)){
              a <- c(a,length(which(v==i)))
            }
            
            df+a
            
              Name1 Name2 Name3 Name4 Name5 Name6
            1     6     4     2     1     3     1
            

            像这样读取您的数据。

            v <- c(1, 2, 1, 1, 2, 4)
            
            df <- read.table(text="
            Name1 Name2 Name3 Name4 Name5 Name6
                3     2     2     0     3     1", header=T)     
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-01-16
              • 1970-01-01
              • 1970-01-01
              • 2014-07-05
              • 2020-10-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多