Извлекайте значения из Specifi c Rows / Cols и добавляйте в другое - PullRequest
2 голосов
/ 15 марта 2020

Начальные данные:

data = data.frame("Student" = c(1,2,3,4,5),
                  "Class" = c('A','A','B','C','C'),
                  "Score1" = c(7,4,7,2,1),
                  "Score2" = c(2,2,0,10,4),
                  "Score3" = c(8,1,3,2,2))

Желаемый результат:

data1 = data.frame("Student" = c(1,2,3,4,5),
                   "Class" = c('A','A','B','C','C'),
                   "Score1" = c(0,0,7,2,1),
                   "Score2" = c(0,0,0,10,4),
                   "Score3" = c(17,7,3,2,2))

для всех строк, где «Класс» - это «А», я хочу добавить «Счет1» и «Счет2» на «Оценка 3» и установите «Оценка 1» и «Оценка 2» на 0.

Ответы [ 5 ]

4 голосов
/ 15 марта 2020

Вы можете использовать пакет data.table следующим образом:

library(data.table)

cols <- c("Score1", "Score2", "Score3")
setDT(data)[Class=="A", (cols) := .(0, 0, rowSums(.SD)), .SDcols = cols]

#    Student  Class Score1 Score2 Score3
# 1:       1      A      0      0     17
# 2:       2      A      0      0      7
# 3:       3      B      7      0      3
# 4:       4      C      2     10      2
# 5:       5      C      1      4      2
2 голосов
/ 15 марта 2020

Другой вариант dplyr может быть:

data %>%
 mutate(Score3 = (Class == "A") * rowSums(select(., starts_with("Score"))) + (Class != "A") * Score3) %>%
 mutate_at(vars(Score1, Score2), ~ (Class != "A") * .)

  Student Class Score1 Score2 Score3
1       1     A      0      0     17
2       2     A      0      0      7
3       3     B      7      0      3
4       4     C      2     10      2
5       5     C      1      4      2
2 голосов
/ 15 марта 2020

Другой вариант с пакетами apply и dplyr:

data %>%
  mutate(Score3 = case_when(Class == 'A' ~ apply(select(data, starts_with('Score')), 1, sum), TRUE ~ Score3)) %>%
  mutate(Score1 = case_when(Class == 'A' ~ 0, TRUE ~ Score1),
         Score2 = case_when(Class == 'A' ~ 0, TRUE ~ Score2))

#    Student  Class Score1 Score2 Score3
# 1:       1      A      0      0     17
# 2:       2      A      0      0      7
# 3:       3      B      7      0      3
# 4:       4      C      2     10      2
# 5:       5      C      1      4      2
2 голосов
/ 15 марта 2020

Базовая опция R:

#find rows where class is "A"
inds <- data$Class == "A"
#Add sum of the values in col3
data$Score3[inds] <- rowSums(data[inds, -c(1:2)])
#Turn Score1 and Score2 to 0
data[inds, c("Score1", "Score2")] <- 0

#  Student Class Score1 Score2 Score3
#1       1     A      0      0     17
#2       2     A      0      0      7
#3       3     B      7      0      3
#4       4     C      2     10      2
#5       5     C      1      4      2

То же самое можно сделать, используя data.table как

library(data.table)

setDT(data)
data[inds, Score3 := rowSums(.SD), .SDcols = grep('Score', names(data))]
data[inds, c('Score1', 'Score2') := 0]
0 голосов
/ 15 марта 2020

Другой вариант - использовать популярные пакеты & :

В основном это условие if-else, выполненное с использованием операции case_when в dplyr. Важной частью является использование mutate дважды, но первой операцией обязательно должно быть изменение в столбце Score3, для этой конкретной проблемы.

library(dplyr); library(magrittr) #load the packages
data_output <- data %>% mutate(Score3 = (case_when(Class == "A" ~ Score1 + Score2 + Score3, 
                                               Class != "A" ~ Score3))) %>% 
                    mutate(Score1 = (case_when(Class == "A" ~ 0,#if Class is `A`, then Score1 is set to `0` 
                                               Class != "A" ~ Score1)),                                              
                           Score2 = (case_when(Class == "A" ~ 0, 
                                               Class != "A" ~ Score2)));
data_output;
Student Class Score1 Score2 Score3
1       1     A      0      0     17
2       2     A      0      0      7
3       3     B      7      0      3
4       4     C      2     10      2
5       5     C      1      4      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...