【问题标题】:Copy value every n entries, 0 otherwise in r每 n 个条目复制一次值,否则在 r 中复制 0
【发布时间】:2014-11-07 02:57:21
【问题描述】:

我有一个数据框,其中包含我想在该数据框的新列中放入的条目,每 n 次,否则在该新列中为 0

即如果我的数据框是

        col1   col2           number  
        stff1   2012-01-01    14665186 
        stff2  2012-01-01     3782215 
        stff3  2012-01-01     11052835 
        stff1  2012-01-01     6850135 
        stff2  2012-02-01     9746279 
        stff3  2012-02-01     7888386 

我想为每个“stff#”条目生成一个新列,所以第一次生成例如:

        col1   col2           number         newcolstff1
        stff1   2012-01-01    146             146 
        stff2  2012-01-01     378             0
        stff3  2012-01-01     110             0
        stff1  2012-01-01     685             685        
        stff2  2012-02-01     974             0
        stff3  2012-02-01     788             0

然后以此类推,每个 stff 都有一个新列#

到目前为止我已经尝试过:

for(i in 1:length(dataframe[,1])){
ifelse( i=holder[i] ,  dataframe$newcol[holder[i]]<-dataframe[holder[i] , col], dataframe$newcol[i]<-0) }

holder 表示我想在新列中放入的索引,但这只是重复它在整个数据框长度中找到的第一个条目。

有人知道这样做的方法吗?

【问题讨论】:

  • 这样做的最终目的是什么?
  • 所以你只想要stff1?休息0?
  • @SeñorO 完成此操作后,将按另一列聚合。
  • @user1987097 为什么numbers 在预期结果中发生了变化。
  • 你更改数据了吗?

标签: r


【解决方案1】:

您可以使用 model.matrix 为每个 stff# 执行此操作。

dat <- read.table(text="      col1   col2           number  
        stff1   2012-01-01    14665186 
        stff2  2012-01-01     3782215 
        stff3  2012-01-01     11052835 
        stff1  2012-01-01     6850135 
        stff2  2012-02-01     9746279 
        stff3  2012-02-01     7888386 ", header=TRUE)


model.matrix(  ~ 0 + col1 , data=dat) * dat$number
#  col1stff1 col1stff2 col1stff3
#1  14665186         0         0
#2         0   3782215         0
#3         0         0  11052835
#4   6850135         0         0
#5         0   9746279         0
#6         0         0   7888386

获取前 3 个字符的一种方法是使用 substring

【讨论】:

    【解决方案2】:

    您可以使用 acm.disjonctifade4

      library(ade4)
      cbind(df,acm.disjonctif(df[,1,drop=FALSE])*df$number)
      #  col1       col2   number col1.stff1 col1.stff2 col1.stff3
      #1 stff1 2012-01-01 14665186   14665186          0          0
      #2 stff2 2012-01-01  3782215          0    3782215          0
      #3 stff3 2012-01-01 11052835          0          0   11052835
      #4 stff1 2012-01-01  6850135    6850135          0          0
      #5 stff2 2012-02-01  9746279          0    9746279          0
      #6 stff3 2012-02-01  7888386          0          0    7888386
    

    或使用mapply

     un1 <- unique(df$col1)
     df1 <- as.data.frame(mapply(`*`,  with(df, lapply(unique(col1),`==`,
                    col1)), list(df$number)))
    
      colnames(df1) <- paste0("newcol", un1)
      cbind(df,df1)
      #  col1       col2   number newcolstff1 newcolstff2 newcolstff3
      #1 stff1 2012-01-01 14665186    14665186           0           0
      #2 stff2 2012-01-01  3782215           0     3782215           0
      #3 stff3 2012-01-01 11052835           0           0    11052835
      #4 stff1 2012-01-01  6850135     6850135           0           0
      #5 stff2 2012-02-01  9746279           0     9746279           0
      #6 stff3 2012-02-01  7888386           0           0     7888386
    

    【讨论】:

      猜你喜欢
      • 2018-01-06
      • 2020-05-17
      • 2021-04-27
      • 1970-01-01
      • 2012-08-04
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多