添加动态新列

时间:2017-03-10 06:49:46

标签: r dplyr

我想解决的问题如下: 我有一个数据框,比如c,它有一个名为“WasteType”的列名。现在,“WasteType”包含几个因子值(T,U,V等),此列表可能因不同的数据集而异。 我想根据不同的因子值创建新的列T,U等,它将是动态的。这是我创建的功能。如果我得到一些指导和指导,将会有所帮助。

首先,看看我的功能是否正常。我从数据帧中取出前四行,而WasteType仅包含“T”和“U”。所以,我想添加一个列T,如果WastType列有1则显示1,否则为0。同样对于U列。

d<-function(c,x=c$WasteType){
  x1<-unique(x)
  print (x1)
  s<-length(x1)
  n<-ncol(c)
  print(s)
    for(i in 1:s){
      print(x1[i])
      mutate(c,ifelse(x==c(x1[i]),1,0))  ##adding a new column
      colnames(c)[n+1]<-x1[i]            ##renaming the column
      return(c)
  }
}
d(c,x=c$WasteType)

我无法弄清楚为什么上面的函数无法读取mutate()函数。

在R语言编程方面,我还处于一个非常新生的阶段。虽然我在发布之前先查看了几个问题。问题可能看起来很愚蠢,但我还没能解决。

2 个答案:

答案 0 :(得分:0)

我稍稍调整了你的功能:

c <- data.frame(WasteType = c('T', 'U', 'T', 'U'), stringsAsFactors = FALSE)

d <-function(c, x = c$WasteType) {
    x <- c$WasteType
    x1 <- unique(x)
    s <-length(x1)
    n <- ncol(c)

    for(i in seq_len(s)) {
        c <- mutate(c, ifelse(x == x1[i], 1, 0))  
        colnames(c)[n + i] <- x1[i]
    }

    return(c)
}

d(c, x = c$WasteType)

  WasteType T U
1         T 1 0
2         U 0 1
3         T 1 0
4         U 0 1

答案 1 :(得分:0)

如果您想要一个解决方案而不使用sapply编写函数:

    c <- data.frame(WasteType = c('T', 'U', 'T', 'U'), stringsAsFactors = FALSE)
    d <- t(sapply(c$WasteType,function(x) as.numeric(unique(c$WasteType) %in% x)))
    colnames(d) <- unique(c$WasteType)
> cbind(c,d)
  WasteType T U
1         T 1 0
2         U 0 1
3         T 1 0
4         U 0 1

(你会得到一个警告,对象d不会使用row.names,因为有重复项,这是可以的,可以忽略)