R рассчитывать по столбцам на основе условного - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь создать набор данных, который выглядит следующим образом:

name    X1  X2  X3  Num_Low Num_0
case1   0.2 0.5 1   2        0
case2   1   1   1   0        0
case3   0.2 0.2 0   2        1
case4   0.5 1   1   1        0
case5   0   0   1   0        2
case6   0.2 0   0   1        2

В настоящее время мой набор данных содержит столбцы name, X1, X2 и X3.Мне нужна помощь в создании столбцов Num_Low и Num_0.

Num_Low должно быть числом переменных X для каждой строки, значение которых меньше 1, но больше 0.

Num_0 должно бытьчисло переменных X, равное 0 в точности.

В моем фактическом наборе данных у меня есть много переменных, которые начинаются с X, поэтому, если есть что-то, что я могу сделать, кроме ввода X1, X2 и т. д.,это было бы здорово (но не обязательно!).Если есть способ сделать это с помощью dplyr понятным способом, это также было бы очень полезно!

Спасибо!

1 Ответ

0 голосов
/ 25 октября 2018
# Get the index of columns starting with "X" 
index <- which(substr(colnames(df), 1, 1) == "X")
# Compute the new variables based on your conditions
df$Num_Low <- rowSums(df[, index] < 1 & 
                      df[, index] > 0)
df$Num_0 <- rowSums(df[, index] == 0)
df

#   name  X1  X2 X3 Num_Low Num_0
#1 name1 0.2 0.5  1       2     0
#2 name2 1.0 1.0  1       0     0
#3 name3 0.2 0.2  0       2     1
#4 name4 0.5 1.0  1       1     0
#5 name5 0.0 0.0  1       0     2
#6 name6 0.2 0.0  0       1     2

dplyr версия:

library(dplyr)
df %>%
  select(index) %>%
  mutate(Num_Low = rowSums(. < 1 & . > 0),
         Num_0 = rowSums(. == 0))

#   name  X1  X2 X3 Num_Low Num_0
#1 name1 0.2 0.5  1       2     0
#2 name2 1.0 1.0  1       0     0
#3 name3 0.2 0.2  0       2     1
#4 name4 0.5 1.0  1       1     0
#5 name5 0.0 0.0  1       0     2
#6 name6 0.2 0.0  0       1     2

Пример данных

df <- data.frame(name = paste0("name", 1:6),
                 X1 = c(0.2,1,0.2,0.5,0,0.2),
                 X2 = c(0.5,1,0.2,1,0,0),
                 X3 = c(1,1,0,1,1,0))
...