【问题标题】:How can I use a loop index to reference variable names and create new variable names?如何使用循环索引来引用变量名并创建新的变量名?
【发布时间】:2021-05-01 10:37:35
【问题描述】:

假设我在 R 中有 4 个变量属于数据集 data1 并命名为 x1x2y1y2,并且我想使用循环来创建以下变量 @987654327 @ 代表i=1,2,它也属于data1。这些变量定义如下:

我之前将其编码为

data1$x1<-c(1,2,3)
data1$x2<-c(2,3,4)
data1$y1<-c(3,4,5)
data1$y2<-c(4,5,6)

我之前将流程编码为

data1$z1<-data1$x1*data1$y1
data1$z2<-data1$x2*data1$y2

这对于只创建两个新变量似乎很实用,但我想学习如何使用循环来处理需要使用此模式创建更多变量的情况。

我尝试过在线搜索但没有成功,因为我真的不知道要搜索什么。我知道创建新变量时我可以使用 paste0 和 assign 函数,但我不确定如何使用循环索引来引用现有变量。

非常感谢任何帮助!

【问题讨论】:

  • 请阅读r标签页顶部关于如何提问的说明。由于未定义 data1,因此除了您之外没有人可以使用问题中的变量。
  • 再次道歉。我已按照您的建议进行了编辑。够了吗?

标签: r string loops


【解决方案1】:

已根据对问题的修订进行了修订。假设data1 是最后注释中显示的数据框,我们得到xnames(x 列名称的字符向量)、ynamesznames。然后将data1[xnames]data1[ynames]相乘,将结果的名称设置为znamescbind原始数据。

x_names <- grep("x", names(data1), value = TRUE)
y_names <- grep("y", names(data1), value = TRUE)
z_names <- sub("x", "z", x_names)

cbind(data1, setNames(data1[xnames] * data1[ynames], znames))

给予:

  x1 x2 y1 y2 z1 z2
1  1  2  3  4  3  8
2  2  3  4  5  8 15
3  3  4  5  6 15 24

注意

以可重现的形式输入:

data1 <- list()
data1$x1<-c(1,2,3)
data1$x2<-c(2,3,4)
data1$y1<-c(3,4,5)
data1$y2<-c(4,5,6)
data1 <- as.data.frame(data1)

【讨论】:

  • 谢谢!是否可以调整此代码以反映 x 和 y 属于数据集“data1”并且 z 也将添加到 data1 中?
  • 我不明白设置。请给出一些测试数据。
  • 对不起,我不够清楚。我之前编码的方式如下:data1$z1
  • 请编辑问题并提供一些我们可以使用的小测试数据。不要引用你没有定义的对象。
  • 通常在 R 中,整体对象方法优于循环。
【解决方案2】:

这是我认为您在简单的for 循环中想要的。诀窍是使用[[ 表示法而不是$ 来选择变量。

data1 <- data.frame(x1 = 1:4,
                    x2 = 11:14,
                    x3 = 21:24,
                    y1 = 101:104,
                    y2 = 111:114,
                    y3 = 121:124)

for (index in 1:3) {
  
  data1[[paste0("z", index)]] <- data1[[paste0("x", index)]] * data1[[paste0("y", index)]]
  
}

# > data1
#   x1 x2 x3  y1  y2  y3  z1   z2   z3
# 1  1 11 21 101 111 121 101 1221 2541
# 2  2 12 22 102 112 122 204 1344 2684
# 3  3 13 23 103 113 123 309 1469 2829
# 4  4 14 24 104 114 124 416 1596 2976

【讨论】:

  • 是的!谢谢!
【解决方案3】:

试试下面的代码

x <- mget(ls(pattern = "^x"))
y <- mget(ls(pattern = "^y"))
list2env(setNames(Map("*",x,y),paste0("z",seq_along(x))),envir = .GlobalEnv)

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多