我是R的新手,正在使用Stata。我可以在Stata中使用foreach和forvalue遍历变量。

我想遍历列而不是遍历行。例如,我有一个名为var1,var2,var3的列。数据如下:

var1 var2 var3
  1    1   1
  2   999  3
 999   2  999

我想将变量中的所有“999”值重新编码为丢失。在Stata,我可以做
forvalue i = 1(1)3{
  replace var`i' ="NA" if var`i' =="999"
}

因此,我有这样的结果
var1 var2 var3
  1    1   1
  2   NA   3
  NA   2  NA

另外,如果我有名为ht,wgt,bmi的列,我想计算该列的均值并将该均值存储在具有相应名称的新列中。数据集如下:
 ht     wgt   bmi
154.5  43.1 18.1
164.2  63   23.4

在Stata,我可以做
foreach i of varlist ht wgt bmi{
  gen `i'mean = mean(`i')
}

结果将是
 ht    wgt   bmi  htmean wgtmean bmimean
154.5  43.1 18.1  159.35  53.05   20.75
164.2  63   23.4  159.35  53.05   20.75

我不知道如何使用R。

最佳答案

有许多不同的方法可以执行此类操作。例如。对于身高,体重,BMI示例,您可以使用for循环,与在Stata中进行的操作基本相同:

# For-loop approach
for (col in c("ht", "wgt", "bmi")) {
    new_col = paste0(col, "_mean")
    df2[, new_col] = mean(df2[, col])
}

区别在于,代码中的符号和R中的字符串之间存在更强的分隔,因此您可以将列名称指定为字符串,使用paste0创建表示新列名称的字符串,然后将其添加到数据框中。

另一种方法是使用dplyr包和mutate_at函数,它们将对多个列应用相同的转换:
library(dplyr)

df2 %>%
    mutate_at(c("ht", "wgt", "bmi"),
              list(mean = ~ mean(.)))

语法有些棘手:首先我们给列名命名,然后下一个参数显示我们如何转换列。 .是当前列的占位符,~意味着R不会立即尝试计算mean(.),而是将等到我们有实际值替换时。当我们使用列表并为转换命名时,例如list(transform = ~ . + 2)dplyr自动使用名称作为后缀,因此您将获得诸如x_transformy_transform等的列名称。

关于r - 如何使用R在Stata中执行诸如foreach之类的操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56351999/

10-12 17:36
查看更多