gpt4 book ai didi

r - 写间接引用变量的R代码绕过硬编码效率低吗?

转载 作者:行者123 更新时间:2023-12-01 13:57:23 26 4
gpt4 key购买 nike

假设我有以下数据框:

x <- data.frame(id= c("a", "b", "c", "d", "e")
, term= c(179, 192, 189, 182, 179)
, f17= c(1, 2, 3, 4, 5)
, s18= c(6, 7, 8, 9, 10)
, f18 = c(11, 12, 13, 14, 15)
, s19 = c(16, 17, 18, 19, 20))

在此数据框中,我想创建一个变量来记录给定术语的相应列中每个 id 的值(f17 对应术语 179,s18 对应术语 182,f18 对应术语 189,f19 对应至第 192 期)。

显然,这可以作为一系列 ifelse 语句轻松完成,但每隔几个月我就会获得新的数据条款,我不想每次获得更多数据时都必须手动重新编码。此外,我发现这种包含大量嵌套 ifelse 语句的编码非常难以阅读。

我对 R 比较陌生,但我是一个非常有经验的 SAS 和 SAS 宏程序员,所以我知道在 SAS 中,我想做的事情可以很容易地通过几个数组和一个数据步骤中的 do 循环来完成,这就是我本质上试图在 R 中重新创建的内容。我最终所做的如下。

注意:我意识到下面的内容与一系列嵌套的 ifelse 语句不同,而是一系列 ifelse 语句,以便覆盖相同的变量,但这确实为我提供了解决方案需要,考虑到我数据中的所有情况。

xTerms <- c(179, 182, 189, 192)
xVars <- c("f17", "s18", "f18", "s19")

x$startVal <- NA
for(i in 1:length(xTerms)){
x$startVal <- ifelse(x$term == xTerms[i], x[[xVars[i]]], x$startVal)
}

我应该补充一下,这是期望的结果:

> x
id term f17 s18 f18 s19 startVal
1 a 179 1 6 11 16 1
2 b 192 2 7 12 17 17
3 c 189 3 8 13 18 13
4 d 182 4 9 14 19 9
5 e 179 5 10 15 20 5

上面代码的想法是,当我获得新数据时,我只需要更新 xTerms 和 xVars 的定义。或者我什至可以根据 x 中的术语变量值和 x 中的变量的唯一列表动态创建那些。

如果这是解决 R 中此类迭代问题的最佳方法,我很想从更有经验的 R 用户那里得到反馈?您是否可以分享有关如何更好地利用 R 的此类事情的资源?

最佳答案

您可以使用匹配...

xTerms <- c(179, 182, 189, 192)
xVars <- c("f17", "s18", "f18", "s19")

x$startVal <- sapply(1:nrow(x), function(i) x[i, xVars[match(x$term[i], xTerms)]])

x
id term f17 s18 f18 s19 startVal
1 a 179 1 6 11 16 1
2 b 192 2 7 12 17 17
3 c 189 3 8 13 18 13
4 d 182 4 9 14 19 9
5 e 179 5 10 15 20 5

关于r - 写间接引用变量的R代码绕过硬编码效率低吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56497743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com