我是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_transform
,y_transform
等的列名称。关于r - 如何使用R在Stata中执行诸如foreach之类的操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56351999/