gpt4 book ai didi

r - 通过划分两列来创建新的数据列,确定第三列中的除数/除数

转载 作者:行者123 更新时间:2023-12-02 16:15:39 25 4
gpt4 key购买 nike

我的数据帧结构如下,x_Lx_R 对的数量可能最多为 100。

ID  Side  A_L   A_R   B_L   B_R
1 0 7 5 6 3
2 1 3 2 3 1
3 0 6 3 4 5

我知道想要为每对 A_LA_R 创建一个新列 A_ratio。每个 ID 的新列的值应为 A_L/A_R(如果 Side==0),或 A_R/A_L(如果 )边==1

我的尝试是实现增量为 2 的 for 循环,仅覆盖每对一次,并使用 ifelse 来区分 的两个可能值>侧面

for (i in seq(from = 3, to = length(df), by = 2)) {
df[sub("_L", "_ratio",(names(df[i]))] <-ifelse(df[2]==0, df[i] / df[i+1], df[i+1] / df[i])
}

但这会导致以下警告:

In `[<-.data.frame`(`*tmp*`, sub("_L", "_ratio", names(df[i])),  : provided 3 variables to replace 1 variables

对于所有情况,结果值似乎都是 A_L/A_R,即使对于具有 Side==1 的 ID 也是如此。有人可以指出我的错误吗?我知道应该有一个更简单的 dplyr 方法,但不幸的是我还不熟悉它。提前致谢!

最佳答案

这是一个dplyr方法。

它仅依赖于以 "L" 结尾的变异列。然后使用 cur_column()要获取正在处理的列的名称,我们可以使用 str_replace 创建匹配列的名称。和get()它的值(value)。

我们可以将此方法与 case_when 结合起来考虑 Side 的影响.

最后,我们可以使用rename_with修复列名称,因为它们将基于原始 L列名称。

library(dplyr) 
library(stringr)
df %>%
mutate(across(ends_with("L"), ~case_when(Side == 1 ~ get(str_replace(cur_column(),"L$","R"))/.,
Side == 0 ~ ./get(str_replace(cur_column(),"L$","R"))),
.names = "{.col}_Ratio")) %>%
rename_with(~str_replace(.,"_L",""),contains("_L_"))
ID Side A_L A_R B_L B_R A_Ratio B_Ratio
1 1 0 7 5 6 3 1.4000000 2.0000000
2 2 1 3 2 3 1 0.6666667 0.3333333
3 3 0 6 3 4 5 2.0000000 0.8000000

关于r - 通过划分两列来创建新的数据列,确定第三列中的除数/除数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66781985/

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