Как суммировать строки только с определенными столбцами - PullRequest
1 голос
/ 07 мая 2020

Итак, у меня есть набор данных, основанный на обучении HR, в котором задаются технические и общие вопросы.

Строки представляют сотрудника, а столбцы - оценку, полученную им по каждому вопросу. Столбцы также включают демографические c данные. Я хочу видеть только общее количество технических и общих вопросов, а не демографические c данные.

techs<-grep("^T",rownames(dat))
commons<-grep("^C",rownames(dat))

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

total<-rowsum(commons,techs) 

и попытаюсь поместить его в линейную регрессию:

Mod1Train<-lm(total~.,data=dat[Train,])

там написано, что существуют разные длины.

Я супер новичок ie в R, так что заранее извините, если я действительно отключен.

Ответы [ 2 ]

1 голос
/ 07 мая 2020

в будущем будет очень полезно, если вы предоставите образец своих данных. Нам трудно помочь, когда мы об этом догадываемся. Пожалуйста, посмотрите эту ссылку { ссылка }.

Сказав это LOL и осознав, что вы новичок, я сделаю предположение ...

Давайте сделаем притворные данные, которые Я полагаю, это уменьшенная воображаемая версия вашего ...

set.seed(2020)
emplid <- 1:10
gender <- sample(c("Male", "Female"), size = 10, replace = TRUE)
Tech1 <- sample(10:20, size = 10, replace = TRUE)
Tech2 <- sample(10:20, size = 10, replace = TRUE)
Tech3 <- sample(10:20, size = 10, replace = TRUE)
Common1 <- sample(10:20, size = 10, replace = TRUE)
Common2 <- sample(10:20, size = 10, replace = TRUE)
Common3 <- sample(10:20, size = 10, replace = TRUE)
Kathryn <-  data.frame(emplid, gender, Tech1, Tech2, Tech3, Common1, Common2, Common3)
Kathryn
#>    emplid gender Tech1 Tech2 Tech3 Common1 Common2 Common3
#> 1       1 Female    10    17    15      18      17      15
#> 2       2 Female    17    13    11      20      11      13
#> 3       3   Male    17    11    19      18      10      12
#> 4       4 Female    19    16    15      14      15      16
#> 5       5 Female    11    13    20      20      16      13
#> 6       6   Male    15    11    17      19      17      13
#> 7       7   Male    11    13    11      15      14      11
#> 8       8 Female    12    14    10      11      17      19
#> 9       9 Female    11    13    15      18      11      10
#> 10     10 Female    17    20    12      12      14      15

Если вы новичок, возможно, вы захотите потратить некоторое время на изучение tidyverse, который может сделать это просто, как здесь Эффективно суммируйте несколько столбцов в R

Согласно вашему примечанию в комментариях, у вас есть шаблон, который мы можем сопоставить для суммирования вопросов. Вы были близки к своей попытке grep, но мы хотим вернуть значения, поэтому нам нужно value = TRUE, которые мы будем хранить и использовать.

techqs <- grep(x = names(Kathryn), pattern = "^Tech", value = TRUE)
commonqs <- grep(x = names(Kathryn), pattern = "^Common", value = TRUE)
Kathryn$TechScores <- rowSums(Kathryn[,techqs])
Kathryn$CommonScores <- rowSums(Kathryn[,commonqs])

### Commented out how to do it manually.
# Kathryn$TechScores <- rowSums(Kathryn[,c("TQ1", "TQ2", "TQ3")])
# Kathryn$CommonScores <- rowSums(Kathryn[,c("CQ1", "CQ2", "CQ3")])

Kathryn$TotalScore <- Kathryn$TechScores + Kathryn$CommonScores

Теперь перейдем к регрессии, в которой возникает статистическая проблема входит. Вы действительно пытаетесь предсказать общий балл по компонентам ??? Это несложно в r, но приводит к глупым ответам.

Kathryn_model <- lm(formula = TotalScore ~ TechScores + CommonScores, data = Kathryn)
summary(Kathryn_model)
#> Warning in summary.lm(Kathryn_model): essentially perfect fit: summary may be
#> unreliable
#> 
#> Call:
#> lm(formula = TotalScore ~ TechScores + CommonScores, data = Kathryn)
#> 
#> Residuals:
#>        Min         1Q     Median         3Q        Max 
#> -3.165e-14 -1.905e-15  9.290e-16  8.590e-15  1.183e-14 
#> 
#> Coefficients:
#>               Estimate Std. Error   t value Pr(>|t|)    
#> (Intercept)  8.089e-14  6.345e-14 1.275e+00    0.243    
#> TechScores   1.000e+00  9.344e-16 1.070e+15   <2e-16 ***
#> CommonScores 1.000e+00  1.130e-15 8.853e+14   <2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 1.43e-14 on 7 degrees of freedom
#> Multiple R-squared:      1,  Adjusted R-squared:      1 
#> F-statistic: 9.875e+29 on 2 and 7 DF,  p-value: < 2.2e-16

0 голосов
/ 07 мая 2020

Я не понимаю ваш код и то, что вы ищете

  1. суммы строк не составляют «итоговую строку», а, наоборот, складывают строки между собой. Он возвращает матрицу, а не вектор. Это то, что вы хотите ? В противном случае, возможно, вы ищете rowSums, который вычисляет итоги каждой строки матрицы. (кстати, если нужно, произведение матриц% *% в R)
  2. Вы точно поняли lm?

В lm должно быть что-то например,

   lm(y~x,data=adataframe)

«adataframe» - это конечный фрейм данных / матрица, где lm ищет как ответ, так и входную переменную, названную здесь «y» и «x». Это необязательно. Если не найдены, y и x ищутся в глобальном окружении, как если бы имена столбцов не были найдены в данных, они ищутся в глобальной среде. Однако иногда лучше иметь такой матричный объект, чтобы избежать распространенных ошибок.

Итак, если вы хотите использовать lm, возможно, вам сначала следует попытаться получить 2 вектора, один для x и один для y, поместите их в data.frame с 2 столбцами (x и y) и вызовите приведенный выше код, если я правильно понял

Примечание: если вы хотите удалить константу, используйте then

   lm(y~x+0,data=adataframe)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...