Stata至R根据条件替换值
我试图在R中做一些非常简单的事情,我可以在Stata中做,但我不能完全正确 这是我的数据样本Stata至R根据条件替换值,r,stata,R,Stata,我试图在R中做一些非常简单的事情,我可以在Stata中做,但我不能完全正确 这是我的数据样本 data如果所有列的条件保持不变,则可以计算一次,以获得不同列中的索引,并将值分配到一起 inds <- with(data, C1 == 2 & C2 == 20 & year == 1990) data[inds, paste0("VAR", 1:3)] <- as.list(c(1, 60, 70)) data # C1 C2 year VAR1 VAR2 VAR
data如果所有列的条件保持不变,则可以计算一次,以获得不同列中的索引,并将值分配到一起
inds <- with(data, C1 == 2 & C2 == 20 & year == 1990)
data[inds, paste0("VAR", 1:3)] <- as.list(c(1, 60, 70))
data
# C1 C2 year VAR1 VAR2 VAR3
#1 2 20 1990 1 60 70
#2 2 20 1991 NA NA NA
#3 2 20 1992 NA NA NA
#4 2 20 1993 NA NA NA
#5 2 20 1994 NA NA NA
#6 20 70 1990 NA NA NA
#7 20 70 1991 NA NA NA
#8 20 70 1992 NA NA NA
#9 20 70 1993 NA NA NA
#10 20 70 1994 NA NA NA
#11 70 80 1990 NA NA NA
#12 70 80 1991 NA NA NA
#13 70 80 1992 NA NA NA
#14 70 80 1993 NA NA NA
#15 70 80 1994 NA NA NA
下面是一个使用data.table的选项
library(data.table)
nm1 <- grep("VAR", names(data))
setDT(data)[C1 == 2 & C2 == 20 & year == 1990, (nm1) := .(1, 60, 70)]
data
# C1 C2 year VAR1 VAR2 VAR3
# 1: 2 20 1990 1 60 70
# 2: 2 20 1991 NA NA NA
# 3: 2 20 1992 NA NA NA
# 4: 2 20 1993 NA NA NA
# 5: 2 20 1994 NA NA NA
# 6: 20 70 1990 NA NA NA
# 7: 20 70 1991 NA NA NA
# 8: 20 70 1992 NA NA NA
# 9: 20 70 1993 NA NA NA
#10: 20 70 1994 NA NA NA
#11: 70 80 1990 NA NA NA
#12: 70 80 1991 NA NA NA
#13: 70 80 1992 NA NA NA
#14: 70 80 1993 NA NA NA
#15: 70 80 1994 NA NA NA
或者使用tidyverse
library(tidyverse)
i1 <- with(data, C1 == 2 & C2 == 20 & year == 1990)
data %>%
select(starts_with("VAR")) %>%
map2_df(., c(1, 60, 70), ~ replace(.x, i1, .y)) %>%
bind_cols(data %>%
select(1:3), .)
库(tidyverse)
i1%
选择(以“VAR”开头)%>%
map2_df(,,c(1,60,70),~replace(.x,i1,.y))%>%
绑定列(数据%>%
选择(1:3),)
数据
数据您想要的Stata语法在两种截然不同的意义上使用&
,&
是一个逻辑运算符,而不是要完成的事情列表中的标点符号。
library(dplyr)
data %>%
mutate(VAR1 = replace(VAR1, C1 == 2 & C2 == 20 & year == 1990, 1),
VAR2 = replace(VAR2, C1 == 2 & C2 == 20 & year == 1990, 60),
VAR3 = replace(VAR3, C1 == 2 & C2 == 20 & year == 1990, 70))
library(data.table)
nm1 <- grep("VAR", names(data))
setDT(data)[C1 == 2 & C2 == 20 & year == 1990, (nm1) := .(1, 60, 70)]
data
# C1 C2 year VAR1 VAR2 VAR3
# 1: 2 20 1990 1 60 70
# 2: 2 20 1991 NA NA NA
# 3: 2 20 1992 NA NA NA
# 4: 2 20 1993 NA NA NA
# 5: 2 20 1994 NA NA NA
# 6: 20 70 1990 NA NA NA
# 7: 20 70 1991 NA NA NA
# 8: 20 70 1992 NA NA NA
# 9: 20 70 1993 NA NA NA
#10: 20 70 1994 NA NA NA
#11: 70 80 1990 NA NA NA
#12: 70 80 1991 NA NA NA
#13: 70 80 1992 NA NA NA
#14: 70 80 1993 NA NA NA
#15: 70 80 1994 NA NA NA
setDT(data, key = c("C1", "C2", "year"))
data[.(2, 20, 1990), (nm1) := .(1, 60, 70)]
library(tidyverse)
i1 <- with(data, C1 == 2 & C2 == 20 & year == 1990)
data %>%
select(starts_with("VAR")) %>%
map2_df(., c(1, 60, 70), ~ replace(.x, i1, .y)) %>%
bind_cols(data %>%
select(1:3), .)
data <- structure(list(C1 = c(2, 2, 2, 2, 2, 20, 20, 20, 20, 20, 70,
70, 70, 70, 70), C2 = c(20, 20, 20, 20, 20, 70, 70, 70, 70, 70,
80, 80, 80, 80, 80), year = c(1990L, 1991L, 1992L, 1993L, 1994L,
1990L, 1991L, 1992L, 1993L, 1994L, 1990L, 1991L, 1992L, 1993L,
1994L), VAR1 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_), VAR2 = c(NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_), VAR3 = c(NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_)),
class = "data.frame", row.names = c(NA,
-15L))