r - 在 R 中循环遍历列并找到第一个值等于 1

标签 r dataframe loops stata

我想遍历数据框中的列(从左到右)并找到每行中第一个等于 1 的值。如果该值等于 1,那么我想向名为 x_time = 9,10,11,12 或 13 的数据框中添加一个新列,具体取决于首先找到值 1 的时间点。

查看数据示例

df <- data.frame(x9 = c('$7', '$7', 2, '$7', 1, '$7'),
                 x10 = c('$7', 1, '$7', '$7', '$7', '$7'),
                 x11 = c('$7', '$7', 2, '$7', 1, '$7'),
                 x12 = c(1, 1, 2, '$7', '$7', '$7'),
                 x13 = c('$7', '$7', 2, '$7', 2, '$7'))
                
Desired output:

  x9 x10 x11 x12 x13 x_time
1 $7  $7  $7   1  $7     12
2 $7   1  $7   1  $7     10
3  2  $7   2   2   2     NA
4 $7  $7  $7  $7  $7     NA
5  1  $7   1  $7   2      9
6 $7  $7  $7  $7  $7     NA

请告诉我什么是最有效的方法。

在 Stata 中,我会制作一个全局宏并循环遍历其内容:

global varlist “x09 x10 x11 x12 x13” 
gen x_time = .
foreach var in $varlist {
    replace x_time = substr("`var'",-2,.) if x_time == . & `var' == 1
}

最佳答案

你可以这样循环

vec <- c()
for (k in 1:nrow(df)) {
  if(length(which(as.vector(unlist(df[k,]))=="1"))>0){
    vec[k] <- as.numeric(gsub("x","",colnames(df)[which(as.vector(unlist(df[k,]))=="1")[1]]))
      
  }else{
    vec[k] <- NA
  }
  
}

df$x_time <- vec

输出

> df
  x9 x10 x11 x12 x13 x_time
1 $7  $7  $7   1  $7     12
2 $7   1  $7   1  $7     10
3  2  $7   2   2   2     NA
4 $7  $7  $7  $7  $7     NA
5  1  $7   1  $7   2      9
6 $7  $7  $7  $7  $7     NA

关于r - 在 R 中循环遍历列并找到第一个值等于 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69810872/

相关文章:

r - 使用 RODBC 从 Revolution R 查询 Oracle DB

python - 如何从另一个列字符串值中删除一个列字符串值?

scala - 如何将 Array[Long] 转换为 Scala 数据帧中的 Vector 类型?

python - 更多 Pythonic/Pandaic 方法循环遍历 pandas 系列

loops - 如何从响应中断(循环/切换)的内部结构中打破外部循环

r - quantstrat 逻辑错误 - 需要 TRUE/FALSE 时缺少值

r - Fisher.test R 崩溃,并出现 *** 捕获段错误 *** 错误

python - 等效于 Python 和 PySpark 中的 R data.table 滚动连接

python - 堆栈后删除多个值

mysql - 使用两个 MySQL 循环填充表