【问题标题】:Translating loop syntax from Stata to R将循环语法从 Stata 转换为 R
【发布时间】:2021-11-27 13:32:25
【问题描述】:

我需要编写一个 for 循环来计算年份变量(例如 var1874)* 价格变量(例如 num1874)的乘积,为每年创建一个新变量及其对应的价格值(例如 newvar1874)。

这是我在 R 中的数据

A tibble: 4 x 7
    cty var1874 var1875 var1876 num1874 num1875 num1876
  <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
1     1    0.78    0.83    0.99    2.64    2.8     3.1 
2     2    0.69    0.69    0.89    2.3     2.3     2.58
3     3    0.42    0.48    0.59    2.28    2.44    2.64
4     4    0.82    0.94    1.09    2.28    2.36    3   

我已经能够使用 Stata 中的“foreach”循环来做到这一点:

local vn 1874 1875 1876

foreach v of local vn {
     gen newvar'v' = var'v'*num'v'

有谁知道我将如何使用 R 中的 for 循环执行相同类型的命令?我知道在没有 for 循环的情况下可能有更简单的方法可以做到这一点,但我需要知道如何使用 for 循环来做到这一点。

【问题讨论】:

  • 不是问题,但这种数据布局在 Stata 中并不好。每年的单独列(变量)只会让用户进行不必要的循环。
  • 无论使用 Stata 还是 R,将数据重新整形为更长的形式会更容易,newvar = var*num 无需循环。

标签: r stata


【解决方案1】:

使用for 循环,您可以这样做:

vn <- 1874:1876

for (v in vn) d[[paste0("newvar", v)]] <- d[[paste0("var", v)]] * d[[paste0("num", v)]]

d
#>   cty var1874 var1875 var1876 num1874 num1875 num1876 newvar1874 newvar1875
#> 1   1    0.78    0.83    0.99    2.64    2.80    3.10     2.0592     2.3240
#> 2   2    0.69    0.69    0.89    2.30    2.30    2.58     1.5870     1.5870
#> 3   3    0.42    0.48    0.59    2.28    2.44    2.64     0.9576     1.1712
#> 4   4    0.82    0.94    1.09    2.28    2.36    3.00     1.8696     2.2184
#>   newvar1876
#> 1     3.0690
#> 2     2.2962
#> 3     1.5576
#> 4     3.2700

或者使用lapply 你可以这样做:

d[, paste0("newvar", vn)] <- lapply(vn, function(v) d[[paste0("var", v)]] * d[[paste0("num", v)]])

数据

d <- structure(list(
  cty = 1:4, var1874 = c(0.78, 0.69, 0.42, 0.82),
  var1875 = c(0.83, 0.69, 0.48, 0.94), var1876 = c(
    0.99, 0.89,
    0.59, 1.09
  ), num1874 = c(2.64, 2.3, 2.28, 2.28), num1875 = c(
    2.8,
    2.3, 2.44, 2.36
  ), num1876 = c(3.1, 2.58, 2.64, 3)
), class = "data.frame", row.names = c(
  "1",
  "2", "3", "4"
))

【讨论】:

  • 好的,谢谢,如果不指定对象值“d”,我该怎么做?如果我必须拼出对象值中的所有内容,那么循环似乎是不必要的。
  • 第一。据我从您的问题中得到的,您的变量已经存储在数据框或小标题中。这就是我命名为d 的对象。通常,在 R 中,推荐的或 R-ish 方式是向数据框添加新变量,而不是在全局环境中创建单独的变量。据我所知,这是与没有数据框架之类的 Stata 或 SPSS 相比的主要区别之一,即只有一个数据集,因此所有新创建的变量都将自动添加到该数据集中。
  • 是的,这就是我正在尝试做的事情:将新变量(产品)添加到现有数据框中。我将如何使用没有对象'd'的 for 循环来做到这一点?
  • 只需将我的代码中的d 替换为您用于数据框的名称即可。
  • Stata 支持框架。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
相关资源
最近更新 更多