Создание нового столбца в R - PullRequest
0 голосов
/ 20 октября 2018

У меня есть data.frame, подобный следующему:

regions       admit    men_age         group    
   1          1234        34              2
   2          3416        51              1
   3          2463        26              3
   4          1762        29              2
   5          2784        31              4
   6          999         42              1
   7          2111        23              2
   8          1665        36              3
   9          2341        21              4
   10         1723        33              1

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

regions      admit    men_age      group  admit1   admit2   admit3  admit4    
   1          1234        34          2       0     1234       0       0
   2          3416        51          1     3416      0        0       0
   3          2463        26          3       0       0       2463     0
   4          1762        29          2       0      1762      0       0
   5          2784        31          4       0       0        0      2784
   6          999         42          1      999      0        0       0
   7          2111        23          2       0      2111      0       0
   8          1665        36          3       0       0       1665     0
   9          2341        21          4       0       0        0      2341
   10         1723        33          1      1723     0        0       0

На самом деле, что яВы хотите создать четыре новых столбца допуска в соответствии со столбцом группы следующим образом: в столбце допустим 1, значение для строк, где группа равна 1, поставить соответствующий номер допуска, в противном случае - ноль.В столбце admit 2 значения для строк, где group равен 2, помещают соответствующий номер допуска, в противном случае ставят ноль и это относится и к двум другим столбцам.

Я попытался решить эту проблему несколькими способами, но не смог.

Может кто-нибудь помочь мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Решение Base R будет использовать ifelse().Предположим, вы data.frame x, вы можете сделать это:

# create the columns with the selected values
for( i in 1:4 ) x[ i + 4 ] <- ifelse( x$group == i, x$admit, 0 )
# rename the columns to your liking
colnames( x )[ 5:8 ] <- c( "admit1", "admit2", "admit3", "admit4" )

Это даст вам

> x
   regions admit men_age group admit1 admit2 admit3 admit4
1        1  1234      34     2      0   1234      0      0
2        2  3416      51     1   3416      0      0      0
3        3  2463      26     3      0      0   2463      0
4        4  1762      29     2      0   1762      0      0
5        5  2784      31     4      0      0      0   2784
6        6   999      42     1    999      0      0      0
7        7  2111      23     2      0   2111      0      0
8        8  1665      36     3      0      0   1665      0
9        9  2341      21     4      0      0      0   2341
10      10  1723      33     1   1723      0      0      0

Если вам не нравится явное именование, вы можете сделать этоуже в цикле for():

for( i in 1:4 ) 
{ 
    adm <- paste ( "admit", i, sep = "" )
    x[ adm ] <- ifelse( x$group == i, x$admit, 0 )
}
0 голосов
/ 20 октября 2018

Решение с использованием tidyverse.Мы можем создать столбцы и затем распределить их с помощью fill = 0.

library(tidyverse)

dat2 <- dat %>%
  mutate(group2 = str_c("admit", group), admit2 = admit) %>%
  spread(group2, admit2, fill = 0)
dat2
#    regions admit men_age group admit1 admit2 admit3 admit4
# 1        1  1234      34     2      0   1234      0      0
# 2        2  3416      51     1   3416      0      0      0
# 3        3  2463      26     3      0      0   2463      0
# 4        4  1762      29     2      0   1762      0      0
# 5        5  2784      31     4      0      0      0   2784
# 6        6   999      42     1    999      0      0      0
# 7        7  2111      23     2      0   2111      0      0
# 8        8  1665      36     3      0      0   1665      0
# 9        9  2341      21     4      0      0      0   2341
# 10      10  1723      33     1   1723      0      0      0

ДАННЫЕ

dat <- read.table(text = "regions       admit    men_age         group    
   1          1234        34              2
                  2          3416        51              1
                  3          2463        26              3
                  4          1762        29              2
                  5          2784        31              4
                  6          999         42              1
                  7          2111        23              2
                  8          1665        36              3
                  9          2341        21              4
                  10         1723        33              1",
                  header = TRUE)
...