Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R根据数据帧/TIBLE中未完成的计算值生成滞后值_R_Loops_Dplyr_Tidyverse - Fatal编程技术网

R根据数据帧/TIBLE中未完成的计算值生成滞后值

R根据数据帧/TIBLE中未完成的计算值生成滞后值,r,loops,dplyr,tidyverse,R,Loops,Dplyr,Tidyverse,由于我没有在R中使用循环和相关循环等价函数(例如purr和apply()相关函数)的经验,我认为我的问题很容易解决。但是,花一些时间没有任何确定的结果,询问社区似乎更合理 为了理解这个问题,想象一下使用mtcars包中的数据。我想创建一个基于某个值的变量,例如wt(重量)。因此,数据框按降序排列如下: library(tidyverse) library(mtcars) df <- mtcars %>% arrange(desc(wt)) 我知道,mutate无法正常工作

由于我没有在R中使用循环和相关循环等价函数(例如
purr
apply()
相关函数)的经验,我认为我的问题很容易解决。但是,花一些时间没有任何确定的结果,询问社区似乎更合理

为了理解这个问题,想象一下使用
mtcars
包中的数据。我想创建一个基于某个值的变量,例如
wt
(重量)。因此,数据框按降序排列如下:

library(tidyverse)
library(mtcars)

df <- mtcars %>% 
  arrange(desc(wt)) 
我知道,
mutate
无法正常工作,因为需要为else参数创建
wt_2
,但如果在新的代码段中指定,则可以工作。这意味着:

df <- mtcars %>% 
  arrange(desc(wt)) %>% 
  mutate(wt_2 = if_else(wt == max(wt),
                        wt,
                        0)) %>% 
  mutate(wt_2 = if_else(wt_2 != max(wt),
                        lag(wt_2) / 2,
                        wt_2))
第三个值应该是
2.71/2=1.355
。第四个值
1.355/2
,因此一个

新变量
wt_2
参考
wt
,但最高值(5.42或5.425未四舍五入)除外。每个观察值应分配相同变量先前观察值的滞后值(使用
滞后
逻辑)除以2(或另一个值,但对于本例,我决定选择2作为除数)。
但是,问题是,由于只有第一个观测值或第一个和第二个观测值被赋值,因此无法使用代码。可以手动计算每个值,但也可以使用循环相关函数更容易地计算值。

是一种矢量化语言,通常不需要循环

这里,您希望每行的最大值除以2,这相当于除以2等于行号的幂减1

因此,此代码应给出您的预期输出:

df=mtcars %>% 
   select(wt) %>% 
   arrange(desc(wt)) %>% 
   mutate(wt_2 = max(wt) / 2^(row_number()-1))) %>% 
   round(2)
预期产出:

glimpse(df$wt_2)
#num [1:32] 5.42 2.71 1.36 0.68 0.34 0.17 0.08 0.04 0.02 0.01 ...

谢谢你的回答。我不认为建议的代码解决了我的问题。在这种情况下,使用
max
应该很有用,因为我想在新变量中保持降序中的最高观察值相同。我不明白为什么你要除以
row_number()
作为计算的指数,因为我想在每种情况下引用相同变量的先前观察值。因此我认为我需要保留先前的设计,但需要使其在其他行上工作。事实上,我只需要wt的最高观察值(=5.425)以及此计算的行数/观察值。除最高值(=5.425)外,
wt
中的值对于这种特定类型的计算,此计算不重要,但应分配到正确的降序
wt
。因此
wt_2
的第一个观测值应为5.425,第二个观测值为5.425/2(=2.7125),第三个观测值为2.7125/2(=1.35625)如上所述。这就是为什么我认为某种循环是必要的,以便提前计算值。@Iwarode抱歉,但我不明白您到底想做什么。您能为您的问题添加一个
wt_2
的预期输出吗?想象一下我回答的最后一段代码(在这里,我瞥见了新变量),其值与我之前的评论中给出的值相同,但所有值都是按照我上一次对您的答案的评论中所述进行计算的
scape(df$wt_2)num[1:32]5.42 2.71 1.36 0.68 0.34…
@Iwarode我的代码中有一个错误,现在已更正并给出了预期的输出。如果这仍然不是您想要的,您可能需要修改示例,以便预期的输出更接近您的实际用途。
df=mtcars %>% 
   select(wt) %>% 
   arrange(desc(wt)) %>% 
   mutate(wt_2 = max(wt) / 2^(row_number()-1))) %>% 
   round(2)
glimpse(df$wt_2)
#num [1:32] 5.42 2.71 1.36 0.68 0.34 0.17 0.08 0.04 0.02 0.01 ...