我如何在 R 中循环这个函数?
How can i loop this function in R?
基本上我有两个数据帧,我想将一个数据帧的每个变量的属性传输到另一个具有相同变量但具有空属性(none)的数据帧。让我知道谢谢
attributes(egresados$q0001)<-attributes(egresados_atr$q0001)
attributes(egresados$q0002)<-attributes(egresados_atr$q0002)
attributes(egresados$q0003)<-attributes(egresados_atr$q0003)
attributes(egresados$q0004)<-attributes(egresados_atr$q0004)
attributes(egresados$q0005_0001)<-attributes(egresados_atr$q0005_0001)
attributes(egresados$q0005_0002)<-attributes(egresados_atr$q0005_0002)
attributes(egresados$q0005_0003)<-attributes(egresados_atr$q0005_0003)
attributes(egresados$q0005_0004)<-attributes(egresados_atr$q0005_0004)
attributes(egresados$q0005_0005)<-attributes(egresados_atr$q0005_0005)
attributes(egresados$q0005_0006)<-attributes(egresados_atr$q0005_0006)
attributes(egresados$q0005_0007)<-attributes(egresados_atr$q0005_0007)
attributes(egresados$q0006_0001)<-attributes(egresados_atr$q0006_0001)
attributes(egresados$q0006_0002)<-attributes(egresados_atr$q0006_0002)
attributes(egresados$q0006_0003)<-attributes(egresados_atr$q0006_0003)
attributes(egresados$q0006_0004)<-attributes(egresados_atr$q0006_0004)
attributes(egresados$q0007)<-attributes(egresados_atr$q0007)
attributes(egresados$q0008)<-attributes(egresados_atr$q0008)
attributes(egresados$q0009_0001)<-attributes(egresados_atr$q0009_0001)
attributes(egresados$q0009_0002)<-attributes(egresados_atr$q0009_0002)
attributes(egresados$q0009_0003)<-attributes(egresados_atr$q0009_0003)
attributes(egresados$q0009_0004)<-attributes(egresados_atr$q0009_0004)
attributes(egresados$q0010_0001)<-attributes(egresados_atr$q0010_0001)
attributes(egresados$q0011_0001)<-attributes(egresados_atr$q0011_0001)
attributes(egresados$q0012)<-attributes(egresados_atr$q0012)
attributes(egresados$q0013_0001)<-attributes(egresados_atr$q0013_0001)
attributes(egresados$q0014)<-attributes(egresados_atr$q0014)
我在 stuggle 中使用 tidyverse 和 rio 包,我知道函数 gather_attrs
和 spread_attrs
我认为可能有帮助,但不知道如何....
您可以使用 Map
-
尝试以下操作
egresados[] <- Map(function(x, y) {attributes(x) <- attributes(y);x},
egresados, egresados_atr[names(egresados)])
假设它们是按相同的顺序排序的,那么你可以使用以下方法:
# create some data as an example
egresados <- setNames(as.list(1:14), sprintf("q%04d", 1:14))
egresados_atr <- setNames(as.list(letters[1:14]), sprintf("q%04d", 1:14))
for(i in 1:length(egresados_atr))
attributes(egresados_atr[[i]]) <- list(value = egresados_atr[[i]],
x = 1)
# get the result
res_1 <- Map(
function(value, other) do.call(structure, c(list(value), attributes(other))),
value = egresados, other = egresados_atr)
str(head(res_1, 3)) # show the result for the first three values
#R> List of 3
#R> $ q0001: int 1
#R> ..- attr(*, "value")= chr "a"
#R> ..- attr(*, "x")= num 1
#R> $ q0002: int 2
#R> ..- attr(*, "value")= chr "b"
#R> ..- attr(*, "x")= num 1
#R> $ q0003: int 3
#R> ..- attr(*, "value")= chr "c"
#R> ..- attr(*, "x")= num 1
# in R 4.1.0 or greater
res_2 <- Map(c, lapply(egresados, list), lapply(egresados_atr, attributes)) |>
lapply(do.call, what = structure)
# they give the same
all.equal(res_1, res_2)
#R> [1] TRUE
第一个答案虽然非常接近 ,但使用 do.call
和 structure
。如果数据未按相同顺序排序或元素数量不相等,您可以使用他指出的 egresados_atr[names(egresados)]
。
您可以在名称上使用 for 循环来执行此操作(无需依赖名称的顺序相同)。
for (s in names(egresados)) {
attributes(egresados[[s]]) <- attributes(egresados_atr[[s]])
}
基本上我有两个数据帧,我想将一个数据帧的每个变量的属性传输到另一个具有相同变量但具有空属性(none)的数据帧。让我知道谢谢
attributes(egresados$q0001)<-attributes(egresados_atr$q0001)
attributes(egresados$q0002)<-attributes(egresados_atr$q0002)
attributes(egresados$q0003)<-attributes(egresados_atr$q0003)
attributes(egresados$q0004)<-attributes(egresados_atr$q0004)
attributes(egresados$q0005_0001)<-attributes(egresados_atr$q0005_0001)
attributes(egresados$q0005_0002)<-attributes(egresados_atr$q0005_0002)
attributes(egresados$q0005_0003)<-attributes(egresados_atr$q0005_0003)
attributes(egresados$q0005_0004)<-attributes(egresados_atr$q0005_0004)
attributes(egresados$q0005_0005)<-attributes(egresados_atr$q0005_0005)
attributes(egresados$q0005_0006)<-attributes(egresados_atr$q0005_0006)
attributes(egresados$q0005_0007)<-attributes(egresados_atr$q0005_0007)
attributes(egresados$q0006_0001)<-attributes(egresados_atr$q0006_0001)
attributes(egresados$q0006_0002)<-attributes(egresados_atr$q0006_0002)
attributes(egresados$q0006_0003)<-attributes(egresados_atr$q0006_0003)
attributes(egresados$q0006_0004)<-attributes(egresados_atr$q0006_0004)
attributes(egresados$q0007)<-attributes(egresados_atr$q0007)
attributes(egresados$q0008)<-attributes(egresados_atr$q0008)
attributes(egresados$q0009_0001)<-attributes(egresados_atr$q0009_0001)
attributes(egresados$q0009_0002)<-attributes(egresados_atr$q0009_0002)
attributes(egresados$q0009_0003)<-attributes(egresados_atr$q0009_0003)
attributes(egresados$q0009_0004)<-attributes(egresados_atr$q0009_0004)
attributes(egresados$q0010_0001)<-attributes(egresados_atr$q0010_0001)
attributes(egresados$q0011_0001)<-attributes(egresados_atr$q0011_0001)
attributes(egresados$q0012)<-attributes(egresados_atr$q0012)
attributes(egresados$q0013_0001)<-attributes(egresados_atr$q0013_0001)
attributes(egresados$q0014)<-attributes(egresados_atr$q0014)
我在 stuggle 中使用 tidyverse 和 rio 包,我知道函数 gather_attrs
和 spread_attrs
我认为可能有帮助,但不知道如何....
您可以使用 Map
-
egresados[] <- Map(function(x, y) {attributes(x) <- attributes(y);x},
egresados, egresados_atr[names(egresados)])
假设它们是按相同的顺序排序的,那么你可以使用以下方法:
# create some data as an example
egresados <- setNames(as.list(1:14), sprintf("q%04d", 1:14))
egresados_atr <- setNames(as.list(letters[1:14]), sprintf("q%04d", 1:14))
for(i in 1:length(egresados_atr))
attributes(egresados_atr[[i]]) <- list(value = egresados_atr[[i]],
x = 1)
# get the result
res_1 <- Map(
function(value, other) do.call(structure, c(list(value), attributes(other))),
value = egresados, other = egresados_atr)
str(head(res_1, 3)) # show the result for the first three values
#R> List of 3
#R> $ q0001: int 1
#R> ..- attr(*, "value")= chr "a"
#R> ..- attr(*, "x")= num 1
#R> $ q0002: int 2
#R> ..- attr(*, "value")= chr "b"
#R> ..- attr(*, "x")= num 1
#R> $ q0003: int 3
#R> ..- attr(*, "value")= chr "c"
#R> ..- attr(*, "x")= num 1
# in R 4.1.0 or greater
res_2 <- Map(c, lapply(egresados, list), lapply(egresados_atr, attributes)) |>
lapply(do.call, what = structure)
# they give the same
all.equal(res_1, res_2)
#R> [1] TRUE
第一个答案虽然非常接近 do.call
和 structure
。如果数据未按相同顺序排序或元素数量不相等,您可以使用他指出的 egresados_atr[names(egresados)]
。
您可以在名称上使用 for 循环来执行此操作(无需依赖名称的顺序相同)。
for (s in names(egresados)) {
attributes(egresados[[s]]) <- attributes(egresados_atr[[s]])
}