如何使用循环或 Lapply 从矩阵生成 100 个新变量?
How to use Loops or Lapply to generate 100 new variables from a matrix?
所以,我有一个包含 100 个不同变量的数据框。现在,我想创建 100 个新变量,对应于原始数据框中的每个变量。目前,我正在尝试循环和 lapply 找出解决方法,但到目前为止运气不佳。
这只是数据框的快照(假设我的数据框名称为 er):
a b c d
1 2 3 4
5 6 7 8
9 0 1 2
并使用这 4 个变量中的每一个,我必须创建一个新变量。因此,总共有 4 个新变量。我的变量应该像假设 a1=0.5+a,b1=0.5+b 等等。
我正在尝试以下两种方法:
for (i in 1:ncol(er)) {
[[i]] <- 0.5 + [[i]]
}
或者,我尝试 lapply 如下:
dep <- lapply(er, function(x) {
x<-0.5+er
}
但是,其中 none 个正在运行。任何人都可以让我知道这些代码有什么问题或建议一个有效的代码来执行此操作。我在这里只展示了 4 个变量用于演示。我有大约 100 个。
您可以直接将 0.5(或任何数字)添加到数据框。
er[paste0(names(er), '1')] <- er + 0.5
er
# a b c d a1 b1 c1 d1
#1 1 2 3 4 1.5 2.5 3.5 4.5
#2 5 6 7 8 5.5 6.5 7.5 8.5
#3 9 0 1 2 9.5 0.5 1.5 2.5
Ronak 的回答提供了解决您问题的最有效方法。我将重点说明您的尝试为何无效。
er <- data.frame(a = c(1, 5, 9), b = c(2, 6, 0), c = c(3, 7, 1), d = c(4, 8, 2))
一个。 for循环:
for (i in 1:ncol(er)) {
[[i]] <- 0.5 + [[i]]
}
思考 R 如何解释循环中的每个元素。它将从 1 到 er
的任意多列,并使用 i
占位符,因此在第一次迭代时它将执行:
[[1]] <- 0.5 + [[1]]
这没有意义,因为您根本没有指明要编制索引的内容。相反,您想要的是:
for (i in 1:ncol(er)) {
er[[i]] <- 0.5 + er[[i]]
}
这里,每次迭代的意思是“赋值给er的第i列,er的第i列+0.5”。如果您想进一步添加您想要创建新变量,您将执行以下操作(这有点类似于 Ronak 的回答,只是效率较低):
for (i in 1:ncol(er)) {
er[[paste0(names(er)[i], "1")]] <- 0.5 + er[[i]]
}
作为旁注,最好使用 seq_along(er)
而不是 1:ncol(er)
。
乙。 lapply:
dep <- lapply(er, function(x) {
x<-0.5+er
}
创建函数时,需要什么就指定什么,return通过调用就可以了。这里,function(x) { x + 0.5 }
足以表明您想要 return 变量 + 0.5。由于 lapply()
return 是一个列表(该函数的名称是“列表应用”的缩写),您需要使用 as.data.frame()
:
as.data.frame(lapply(er, function(x) { x + 0.5 }))
但是,这不会更改变量名称,并且这里没有简单有效的方法来更改它:
dep <- as.data.frame(lapply(er, function(x) { x + 0.5 }))
names(dep) <- paste0(names(dep), "1")
cbind(er, dep)
a b c d a1 b1 c1 d1
1 1 2 3 4 1.5 2.5 3.5 4.5
2 5 6 7 8 5.5 6.5 7.5 8.5
3 9 0 1 2 9.5 0.5 1.5 2.5
C。另一种方法是使用 dplyr
语法,它更优雅和可读:
library(dplyr)
mutate(er, across(everything(), ~ . + 0.5, .names = "{.col}1"))
所以,我有一个包含 100 个不同变量的数据框。现在,我想创建 100 个新变量,对应于原始数据框中的每个变量。目前,我正在尝试循环和 lapply 找出解决方法,但到目前为止运气不佳。
这只是数据框的快照(假设我的数据框名称为 er):
a b c d
1 2 3 4
5 6 7 8
9 0 1 2
并使用这 4 个变量中的每一个,我必须创建一个新变量。因此,总共有 4 个新变量。我的变量应该像假设 a1=0.5+a,b1=0.5+b 等等。
我正在尝试以下两种方法:
for (i in 1:ncol(er)) {
[[i]] <- 0.5 + [[i]]
}
或者,我尝试 lapply 如下:
dep <- lapply(er, function(x) {
x<-0.5+er
}
但是,其中 none 个正在运行。任何人都可以让我知道这些代码有什么问题或建议一个有效的代码来执行此操作。我在这里只展示了 4 个变量用于演示。我有大约 100 个。
您可以直接将 0.5(或任何数字)添加到数据框。
er[paste0(names(er), '1')] <- er + 0.5
er
# a b c d a1 b1 c1 d1
#1 1 2 3 4 1.5 2.5 3.5 4.5
#2 5 6 7 8 5.5 6.5 7.5 8.5
#3 9 0 1 2 9.5 0.5 1.5 2.5
Ronak 的回答提供了解决您问题的最有效方法。我将重点说明您的尝试为何无效。
er <- data.frame(a = c(1, 5, 9), b = c(2, 6, 0), c = c(3, 7, 1), d = c(4, 8, 2))
一个。 for循环:
for (i in 1:ncol(er)) {
[[i]] <- 0.5 + [[i]]
}
思考 R 如何解释循环中的每个元素。它将从 1 到 er
的任意多列,并使用 i
占位符,因此在第一次迭代时它将执行:
[[1]] <- 0.5 + [[1]]
这没有意义,因为您根本没有指明要编制索引的内容。相反,您想要的是:
for (i in 1:ncol(er)) {
er[[i]] <- 0.5 + er[[i]]
}
这里,每次迭代的意思是“赋值给er的第i列,er的第i列+0.5”。如果您想进一步添加您想要创建新变量,您将执行以下操作(这有点类似于 Ronak 的回答,只是效率较低):
for (i in 1:ncol(er)) {
er[[paste0(names(er)[i], "1")]] <- 0.5 + er[[i]]
}
作为旁注,最好使用 seq_along(er)
而不是 1:ncol(er)
。
乙。 lapply:
dep <- lapply(er, function(x) {
x<-0.5+er
}
创建函数时,需要什么就指定什么,return通过调用就可以了。这里,function(x) { x + 0.5 }
足以表明您想要 return 变量 + 0.5。由于 lapply()
return 是一个列表(该函数的名称是“列表应用”的缩写),您需要使用 as.data.frame()
:
as.data.frame(lapply(er, function(x) { x + 0.5 }))
但是,这不会更改变量名称,并且这里没有简单有效的方法来更改它:
dep <- as.data.frame(lapply(er, function(x) { x + 0.5 }))
names(dep) <- paste0(names(dep), "1")
cbind(er, dep)
a b c d a1 b1 c1 d1
1 1 2 3 4 1.5 2.5 3.5 4.5
2 5 6 7 8 5.5 6.5 7.5 8.5
3 9 0 1 2 9.5 0.5 1.5 2.5
C。另一种方法是使用 dplyr
语法,它更优雅和可读:
library(dplyr)
mutate(er, across(everything(), ~ . + 0.5, .names = "{.col}1"))