R:如何使用数字索引循环变量名如在 Stata 中 条件:other_var(i) 函数的 TRUE 部分777 函数的 FALSE 部分

如何解决R:如何使用数字索引循环变量名如在 Stata 中 条件:other_var(i) 函数的 TRUE 部分777 函数的 FALSE 部分

我一直在尝试在 R 中复制以下 Stata 循环失败:

forvalues i=1/10 {
    replace var`i'= a if other_var`i'==b
}

到目前为止,我认为这是最接近的尝试:

for(i in 1:10) {
df <- df %>%
                      mutate(get(paste("var",i,sep="")) = 
                      ifelse(get(paste("other_var",sep=""))==b,a,get(paste("var",sep=""))))
}

但我收到以下错误:

Error: unexpected '=' in:
"survey_data <- survey_data %>%
                      mutate(paste("offer","_accepted",sep="") ="

如果我将变量更改为一个简单的变量名称,它就可以工作,所以我猜我的代码对于“突变的右侧”是可以的,但是由于某种原因它不适用于“左侧”。

解决方法

这个解决方案非常不雅,但我认为这正是你想要的。

var1 <- "x"
var2 <- "y"
var3 <- "z"

other_var1 <- 1
other_var2 <- 0
other_var3 <- 1

df <- data.frame(var1,other_var1,var2,other_var2,var3,other_var3)

for(i in 1:3){
  var_name <- paste("df$var",i,sep = "")
  other_var_name <- paste("df$other_var",sep = "")
  if (eval(parse(text = other_var_name)) == 1){
    assign(var_name,"a")
  }
}

这里有三个关键要素。首先 paste() 函数在循环的当前迭代中创建变量的名称。其次,eval(parse(foo)) 组合引用名称作为字符串存储在 foo 中的实际变量。第三,使用 assign() 为变量赋值(而不是使用 <-)。

,

这看起来像 FAQ 7.21。

该答案最重要的部分是最后说要使用列表。

尝试在 R 中处理一组全局变量会导致代码复杂,难以阅读,甚至更难调试。

如果您改为将这些变量放在一个列表中,那么您可以按名称或位置访问它们,并使用 lapplypurrr 包(tidyverse 的一部分)之类的工具来处理列表中的所有内容列表(或使用 map_at 中的 map_ifpurrr 的列表中的某些内容)。

如果告诉我们更多有关您要完成的任务的信息,我们或许可以提供一个更简单的示例来说明如何做到这一点。

,

您可以执行以下操作:

df <- structure(list(var1 = c(1,2,3,4),var2 = c(1,var3 = c(1,var4 = c(1,other_var1 = c(1,1,0),other_var2 = c(0,1),other_var3 = c(1,other_var4 = c(0,1)),class = "data.frame",row.names = c(NA,-4L))
# var1 var2 var3 var4 other_var1 other_var2 other_var3 other_var4
# 1    1    1    1    1          1          0          1          0
# 2    2    2    2    2          0          1          1          0
# 3    3    3    3    3          1          0          0          1
# 4    4    4    4    4          0          1          0          1
## Values to replace based on OP original question
a <- 777
b <- 1
## Iter along all four variables avaible in df
for (i in 1:4) {
  df <-   within(df,{
    assign(paste0("var",i),ifelse(get(paste0("other_var",i)) %in% c(b),## Condition  
                                    a,## Value if Positive
                                    get(paste0("var",i)) ))               ## Value if Negative
  })
}

结果如下:

# var1 var2 var3 var4 other_var1 other_var2 other_var3 other_var4
# 1  777    1  777    1          1          0          1          0
# 2    2  777  777    2          0          1          1          0
# 3  777    3    3  777          1          0          0          1
# 4    4  777    4  777          0          1          0          1

该解决方案看起来不像单行解决方案,但实际上一个,非常密集的一个;因此,让我们看看它的基础组件是如何工作的。

within():我不想重复其他人已经很好地解释的内容,所以对于 within() 的用法,我温和地参考您 here

assign(paste0("var",X) 部分。

这里我关注的是 @han-tyumi 在他的回答中所做的,这意味着使用 paste0() 恢复变量的名称并使用 X 为它们分配值(待解释) {1}} 函数。

让我们谈谈assign()

在我引用 X 之前。实际上,assign(paste0("var",X) 等于 X

ifelse(get(paste0("other_var",a,get(paste0("var",i)) )内部:

条件:

首先,我在循环时将函数 ifelse()other_var(i) 组合起来,恢复变量 get()(其中 i = 1,4)的值。然后,我使用 paste0() 运算符检查分配给变量 %in%(在我的示例中为数字 1)的值是否包含在变量 b 中;这将根据条件是否满足生成 TRUE 或 FALSE。

other_var(i) 函数的 TRUE 部分。

如果满足条件,这是最简单的部分,然后分配 ifelse()(在我的示例中等于 a)。

777 函数的 FALSE 部分。

ifelse():这是变量本身的值(意思是,如果条件不满足,则保持变量不变)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-