Stata至R根据条件替换值

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

我试图在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 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))