如何将Stata中的foreach转换为R?

X. *_*Shi 5 r stata

我有一个数据框 (df),其中包含 CA、VT、NC、AZ、CAvalue、VTvalue、NCvalue、AZvalue 等变量。

在 Stata 中,我可以使用foreach命令和generate新变量:

foreach x in CA VT NC AZ {
    gen `x'1 = 0
    replace `x'1 = 1 if `x'value > 1
}
Run Code Online (Sandbox Code Playgroud)

当我将此代码转换为 R 时,我发现它有问题。

这是我写的:

x=c("CA","VT","NC","AZ")
x_1=paste(x,"1",sep="")
m1=as.data.frame(matrix(0,ncol=length(x),nrow=NROW(df)))
colnames(m1)=x_1
Run Code Online (Sandbox Code Playgroud)

虽然我在创建以“1”结尾的新变量时没有问题,但我不知道如何转换以“replace”开头的行。我尝试用 CAtime、VTtime、NCtime 和 AZtime 创建另一个向量。但是我不知道如何在不写四次的情况下将它们合并到循环中。

更新:最初,我的数据如下所示:

df=as.data.frame(matrix(runif(200,1,150),ncol=8,nrow=25))
name=c("CA","VT","NC","AZ","CAtime","VTtime", "NCtime","AZtime")
colnames(df)=name
Run Code Online (Sandbox Code Playgroud)

然后我想在一个新的数据框 m1 中创建 4 个新变量 CA1、VT1、NC1、AZ1:

x=c("CA","VT","NC","AZ")
x_1=paste(x,"1",sep="")
m1=as.data.frame(matrix(0,ncol=length(x),nrow=NROW(df)))
colnames(m1)=x_1
Run Code Online (Sandbox Code Playgroud)

m1=0 中的所有变量值。

然后,如果CAtime>1,我想要CA1=1中对应的单元格。这适用于所有四个变量 CAtime、VTtime、NCtime、AZtime。我不想写四个循环,这就是我被卡住的原因。

the*_*ail 6

以一个示例 dataset df,匹配您的描述:

set.seed(1)
x <- c("CA","VT","NC","AZ")
df <- setNames(data.frame(replicate(8,sample(0:2,5,replace=TRUE),simplify=FALSE)),
      c("CA","VT","NC","AZ","CAvalue","VTvalue","NCvalue","AZvalue"))
df

#  CA VT NC AZ CAvalue VTvalue NCvalue AZvalue
#1  0  2  0  1       2       1       1       2
#2  1  2  0  2       0       0       1       2
#3  1  1  2  2       1       1       1       0
#4  2  1  1  1       0       2       0       2
#5  0  0  2  2       0       1       2       1
Run Code Online (Sandbox Code Playgroud)

现在lapply检查> 1每个列的值,并将其重新分配给新变量,1并在末尾附加:

df[paste0(x,"1")] <- lapply(df[paste0(x,"value")], function(n) as.numeric(n > 1) )
df

#  CA VT NC AZ CAvalue VTvalue NCvalue AZvalue CA1 VT1 NC1 AZ1
#1  0  2  0  1       2       1       1       2   1   0   0   1
#2  1  2  0  2       0       0       1       2   0   0   0   1
#3  1  1  2  2       1       1       1       0   0   0   0   0
#4  2  1  1  1       0       2       0       2   0   1   0   1
#5  0  0  2  2       0       1       2       1   0   0   1   0
Run Code Online (Sandbox Code Playgroud)

  • @akrun - 当然。我主要是想在与最近从 Stata 过来的人打交道时避免这种诡计。这可能会使问题复杂化,无论如何,`as.numeric` 可能是实现此目的的正式方式。 (4认同)
  • 我也可以做`df[paste0(x,"1")] &lt;- (df[paste0(x, 'value')]&gt;1)+0L` (2认同)