我想遍歷資料框中的列(從左到右)并找到每行中等于 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
}
uj5u.com熱心網友回復:
你可以這樣回圈
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
uj5u.com熱心網友回復:
這是一個data.table方法
library(data.table)
# Convert to data.table, keep rownames as identifier
setDT(df, keep.rownames = TRUE)
# join molten data on df
df[melt(df, id.vars = "rn")[value == 1, .SD[1], by = .(rn)],
x_time := gsub("x", "", i.variable),
on = .(rn)]
# rn x9 x10 x11 x12 x13 x_time
# 1: 1 $7 $7 $7 1 $7 12
# 2: 2 $7 1 $7 1 $7 10
# 3: 3 2 $7 2 2 2 <NA>
# 4: 4 $7 $7 $7 $7 $7 <NA>
# 5: 5 1 $7 1 $7 2 9
# 6: 6 $7 $7 $7 $7 $7 <NA>
uj5u.com熱心網友回復:
這是一個tidyverse方法:
- 如果 colum 為 1,則連接列名。
- 當我們用 1 搜索第一列時,我們可以使用
parse_number它從字串中選擇第一個數字!
library(dplyr)
library(tidyr)
df %>%
mutate(across(x9:x13, ~case_when(. == "1" ~ cur_column()), .names = 'new_{col}')) %>%
unite(New_Col, starts_with('new'), na.rm = TRUE, sep = ' ') %>%
mutate(x_time=parse_number(New_Col), .keep="unused")
輸出:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/345342.html
上一篇:遍歷串列串列,維護串列結構
下一篇:回圈確實顯示了錯誤的變數
