在 R 中创建一个新列

Creating a new column in R

我有一个 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

其实我想做的是根据group列新建4个admit列如下:admit 1列,group为1的rows的value,放对应的admit number,其他放零。在 admit 2 列中,group 为 2 的行的值,放置相应的 admit 编号,否则放置零,这也适用于其他两列。

我尝试了几种方法来解决它,但都失败了。

有人可以帮我解决这个问题吗?

使用 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)

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 )
}