我想遍历数据框中的列(从左到右)并找到每行中第一个等于 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/