Я хочу получить количество столбцов, пока не будет найдено значение 1. Подсчет должен включать только var3, var4 и var5. У меня есть что-то вроде этого:
var1 var2 var3 var4 var5 var6
1 3750893 .5 .6 1 73891
2 75934 1 0 .1 60361
3 85 1 .1 .9 1
4 99283 0 1 .1 64123
А я хочу следующее:
var1 var2 var3 var4 var5 var6 var7
1 3750893 .5 .6 1 73891 3
2 75934 1 0 .1 60361 1
3 85 1 .1 .9 1 1
4 99283 0 1 .1 64123 2
Это код, но:
df <- data.frame(var1=c(1, 2, 3, 4),var2=c(3750893, 75934, 85, 99283),
var3=c(.5, 1, 1, 0), var4=c(.6, 0, .1, 1),
var5=c(1, .1, .9, .1), var6=c(73891, 60361, 1, 64123))
#select columns that will be used to create the new variable
df2 <- df[,c("var3", "var4", "var5")]
#create new variable counting occurrences of value "1" in var3-var5.
df2$var7 <- apply(df2, 1, function(x) length(which(x==1)))
df$var7 <- max.col(df[3:5] == 1, ties.method = 'first')
df
var1 var2 var3 var4 var5 var6 var7
1 1 3750893 0.5 0.6 1.0 73891 3
2 2 75934 1.0 0.0 0.1 60361 1
3 3 85 1.0 0.1 0.9 1 1
4 4 99283 0.0 1.0 0.1 64123 2
Если вы должны использовать apply
, то:
df$var7 <- apply(df[3:5], 1, function(x)which(x==1)[1])
Почему бы и нет max.col(df[3:5] == 1, ties.method = 'first')
?
@ Маэль конечно. Я не читал, что это только варс3-5
Не суперэффективно, но с использованием tidyverse работает следующее:
df %>% pivot_longer(-id) %>%
group_by(id) %>%
mutate(position=ifelse(value==1,str_extract(name,pattern = ".$"),NA)) %>%
ungroup() %>%
pivot_wider(names_from=c(name),values_from = c(value),id_cols = c(id,position)) %>%
mutate(position=as.numeric(position)) %>%
group_by(id) %>%
summarize(across(everything(),~sum(.x,na.rm=T)))
Пожалуйста, измените свой вопрос, чтобы включить воспроизводимые данные в виде кода, а не изображения.