在R中创建新列

时间:2018-10-20 03:47:51

标签: r dataframe calculated-columns

我有一个如下的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的行的值放入相应的接纳数,否则放入零。在接纳2列中,组为2的行的值放入相应的接纳号,否则放入零和,这也适用于其他两列。

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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 )
}
相关问题