我正在尝试替换数据帧的特定列中的值(例如,始终为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>
方法。
答案 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