使用基于给定索引的dplyr替换列中的值

时间:2016-12-07 11:17:09

标签: r replace dplyr

我正在尝试替换数据帧的特定列中的值(例如,始终为j)。替换的列索引在列data <- data.frame(v1 = rep(0, 10), v2 = rep(0, 10), j = sample(1:2, 10, replace = TRUE)) for (i in 1: nrow(data)){ data[i, (data$j[i])] <- 1 } 中给出。

它适用于for循环:

dplyr

我正在寻找处理这种情况的<a appMenuDropDown (click)="getSubMenuItems(menuItem)"> ....... </a> 方法。

2 个答案:

答案 0 :(得分:3)

这是一个使用bind_rows的dplyr版本。首先让我们设置数据:

set.seed(2)
data <- data.frame(v1 = rep(0, 10),
                   v2 = rep(0, 10),
                   j = sample(1:2, 10, replace = TRUE))

然后我们加载dplyr并使用do对每一行进行操作。在这里,我们使用do每行返回一个数据帧,bind_rows将它们合并在一起。可以使用.变量访问每行中的数据。

library(dplyr)

data %>%
    do(data.frame(v1 = ifelse(.$j == 1, 1, .$v1),
                  v2 = ifelse(.$j == 2, 1, .$v2),
                  j = .$j)) %>% 
    bind_rows() 


#   v1 v2 j
#1   1  0 1
#2   0  1 2
#3   0  1 2
#4   1  0 1
#5   0  1 2
#6   0  1 2
#7   1  0 1
#8   0  1 2
#9   1  0 1
#10  0  1 2

@Akrun建议的更短的解决方案是:

data %>% mutate(v1 = +(j==1), v2 = +(j==2))

答案 1 :(得分:2)

这可以通过row/column索引轻松完成,而且应该更快

data[cbind(1:nrow(data), data$j)] <- 1
data
#   v1 v2 j
#1   0  1 2
#2   1  0 1
#3   0  1 2
#4   0  1 2
#5   0  1 2
#6   0  1 2
#7   0  1 2
#8   1  0 1
#9   1  0 1
#10  0  1 2

或者另一种方式是

library(tidyr)
library(dplyr)
tibble::rownames_to_column(data, var = "rn") %>%
           gather(Var, Val, v1:v2) %>% 
           mutate(Val= +(sub("\\D+", "", Var)==j)) %>% 
           spread(Var, Val) %>% 
           arrange(as.numeric(rn)) %>%
           select_(.dots=names(data))
#   v1 v2 j
#1   0  1 2
#2   1  0 1
#3   0  1 2
#4   0  1 2
#5   0  1 2
#6   0  1 2
#7   0  1 2
#8   1  0 1
#9   1  0 1
#10  0  1 2