在R中添加列为数字的行或引用名称为数字的列

时间:2014-08-11 15:03:31

标签: r identity-column

这个问题可能很愚蠢。如何在以下数据框中添加列为数字的行。我们可以在不更改列名的情况下执行此操作。感谢。

Perinatal_Region     1     2   NaN total
           1     13456 12770   1     
           2     36975 35470  NA     
           3    19116 18156   2     
           4    84653 81120   4     
           5    57015 54313   4     
           NaN     1     1   NA    

2 个答案:

答案 0 :(得分:0)

如果您只想对以数字命名的列加总:

data <- data.frame(Perinatal_region = c(1,2,3,4,5,1/0), one = c(13456,36975,19116,84653,57015,1 ), two = c(12770, 35470, 18156, 81120, 54313, 1)) 
names(data) <- c("Perinatal_region", "1", "2")
columns_to_sum <- c()

for(name in names(data)){
  if (is.na(as.numeric(name))==FALSE){ #If the name is not a number as.numeric() returns NA
     columns_to_sum <- c(columns_to_sum, name)
   }

}

a <- colSums(data[columns_to_sum])

结果如下:

> a
     1      2 
211216 201830 

答案 1 :(得分:0)

您可以通过以下几种方式完成此操作:

df <- structure(list(Perinatal_Region = c(1, 2, 3, 4, 5, NaN), `1` = c(13456L, 
36975L, 19116L, 84653L, 57015L, 1L), `2` = c(12770L, 35470L, 
18156L, 81120L, 54313L, 1L), `NaN` = c(1L, NA, 2L, 4L, 4L, NA
)), .Names = c("Perinatal_Region", "1", "2", "NaN"), class = "data.frame", row.names = c(NA, 
-6L))

 rowSums(df[,grep("\\d+", colnames(df))])
 #[1]  26226  72445  37272 165773 111328      2

如果是:

  colSums(df[,grep("\\d+", colnames(df))])
  #    1      2 
 #211216 201830 

或者

 within(df, Total<- `1` +`2`)
 #  Perinatal_Region     1     2 NaN  Total
 #1                1 13456 12770   1  26226
 #2                2 36975 35470  NA  72445
 #3                3 19116 18156   2  37272
 #4                4 84653 81120   4 165773
 #5                5 57015 54313   4 111328
 #6              NaN     1     1  NA      2

 addmargins(as.table(as.matrix(df[,c("1", "2")])))
 #         1      2    Sum
 #A    13456  12770  26226
 #B    36975  35470  72445
 #C    19116  18156  37272
 #D    84653  81120 165773
 #E    57015  54313 111328
 #F        1      1      2
 #Sum 211216 201830 413046

到所有列12NaN

 within(df, Total<- `1` +`2` +`NaN`) 

 rowSums(df[,grep("\\d+|NaN", colnames(df))], na.rm=T)
 #[1]  26227  72445  37274 165777 111332      2