R编程-数据帧管理器

R编程-数据帧管理器,r,data-structures,dataset,R,Data Structures,Dataset,假设我有以下数据帧: dc tmin tmax cint wcmin wcmax wsmin wsmax gsmin gsmax wd rmin rmax cir lr 1: 24 -1 4 5 -5 -2 20 25 35 40 90 11.8 26.6 14.8 3 2: 41 -3 5 8 -8 -3 15 20 35 40 90 10.0 23.5 13.5 3 3:

假设我有以下数据帧:

   dc tmin tmax cint wcmin wcmax wsmin wsmax gsmin gsmax  wd rmin rmax  cir lr
1: 24   -1    4    5    -5    -2    20    25    35    40  90 11.8 26.6 14.8  3
2: 41   -3    5    8    -8    -3    15    20    35    40  90 10.0 23.5 13.5  3
3: 48    0    5    5    -4     0    30    35    45    50  45  7.3 19.0 11.7  6
4: 50    0    5    5    -4     0    30    35    45    50  45  7.3 19.0 11.7  6
5: 52    3    5    2    -3     1    20    25    35    40  45  6.7 17.4 10.7  6
6: 57   -2    5    7    -6    -1    25    30    35    40 315  4.4 13.8  9.4  7
   lc wc    li yd   yr nF factdcx
1:  1  3  TRUE  1 2010  2      24
2:  1  3  TRUE  1 2010  8      41
3:  2  3  TRUE  1 2010  0      48
4:  2  3  TRUE  1 2010  0      50
5:  2  3  TRUE  1 2010  0      52
6:  3  3 FALSE  1 2010  0      57
我想将其转换为如下所示的新数据帧:

   dc tmin tmax cint wcmin wcmax wsmin wsmax gsmin gsmax  wd rmin rmax  cir lr
1: 24   -1    4    5    -5    -2    20    25    35    40  90 11.8 26.6 14.8  3
2: 41   -3    5    8    -8    -3    15    20    35    40  90 10.0 23.5 13.5  3
3: 48    0    5    5    -4     0    30    35    45    50  45  7.3 19.0 11.7  6
4: 52    3    5    2    -3     1    20    25    35    40  45  6.7 17.4 10.7  6
5: 57   -2    5    7    -6    -1    25    30    35    40 315  4.4 13.8  9.4  7
   lc wc    li yd   yr nF                                       factdcx
1:  1  3  TRUE  1 2010  2                                        24  
2:  1  3  TRUE  1 2010  8                                        41
3:  2  3  TRUE  1 2010  0 (sum of nF for 48 and 50, factdcx)     48
4:  2  3  TRUE  1 2010  0                                        52 
5:  3  3 FALSE  1 2010  0                                        57  
我怎么做?(当然,数据帧abc要大得多,但我想要所有类别48和50的总和,并将其分组为一个新类别,比如“48”)

非常感谢

> dput(head(abc1))
structure(list(dc = c(24L, 41L, 48L, 50L, 52L, 57L), tmin = c(-1L, 
-3L, 0L, 0L, 3L, -2L), tmax = c(4L, 5L, 5L, 5L, 5L, 5L), cint = c(5L,
8L, 5L, 5L, 2L, 7L), wcmin = c(-5L, -8L, -4L, -4L, -3L, -6L), 
wcmax = c(-2L, -3L, 0L, 0L, 1L, -1L), wsmin = c(20L, 15L, 
30L, 30L, 20L, 25L), wsmax = c(25L, 20L, 35L, 35L, 25L, 30L
), gsmin = c(35L, 35L, 45L, 45L, 35L, 35L), gsmax = c(40L, 
40L, 50L, 50L, 40L, 40L), wd = c(90L, 90L, 45L, 45L, 45L, 
315L), rmin = c(11.8, 10, 7.3, 7.3, 6.7, 4.4), rmax = c(26.6, 
23.5, 19, 19, 17.4, 13.8), cir = c(14.8, 13.5, 11.7, 11.7, 
10.7, 9.4), lr = c(3L, 3L, 6L, 6L, 6L, 7L), lc = c(1L, 1L, 
2L, 2L, 2L, 3L), wc = c(3L, 3L, 3L, 3L, 3L, 3L), li = c(TRUE, 
TRUE, TRUE, TRUE, TRUE, FALSE), yd = c(1L, 1L, 1L, 1L, 1L, 
1L), yr = c(2010L, 2010L, 2010L, 2010L, 2010L, 2010L), nF = c(2L, 
8L, 0L, 0L, 0L, 0L), factdcx = structure(1:6, .Label = c("24", 
"41", "48", "50", "52", "57", "70"), class = "factor")), .Names = c("dc", 
"tmin", "tmax", "cint", "wcmin", "wcmax", "wsmin", "wsmax", "gsmin", 
"gsmax", "wd", "rmin", "rmax", "cir", "lr", "lc", "wc", "li", 
"yd", "yr", "nF", "factdcx"), class = c("data.table", "data.frame"
), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x054b24a0>)
nF之和不正确,应为零

试试看

library(data.table)
unique(setDT(df1)[, factdcx:= as.character(factdcx)][factdcx %chin% 
  c('48','50'), c('dc', 'factdcx', 'nF') := list('48', '48', sum(nF))])
#    dc tmin tmax cint wcmin wcmax wsmin wsmax gsmin gsmax  wd rmin rmax  cir lr
#1: 24   -1    4    5    -5    -2    20    25    35    40  90 11.8 26.6 14.8  3
#2: 41   -3    5    8    -8    -3    15    20    35    40  90 10.0 23.5 13.5  3
#3: 48    0    5    5    -4     0    30    35    45    50  45  7.3 19.0 11.7  6
#4: 52    3    5    2    -3     1    20    25    35    40  45  6.7 17.4 10.7  6
#5: 57   -2    5    7    -6    -1    25    30    35    40 315  4.4 13.8  9.4  7
#   lc wc    li yd   yr nF factdcx
#1:  1  3  TRUE  1 2010  2      24
#2:  1  3  TRUE  1 2010  8      41
#3:  2  3  TRUE  1 2010  0      48
#4:  2  3  TRUE  1 2010  0      52
#5:  3  3 FALSE  1 2010  0      57
对于
abc1

 res1 <- unique(setDT(abc1)[, factdcx:= as.character(factdcx)][factdcx %chin% 
   c('48','50'), c('dc', 'factdcx', 'nF') := list(48, '48', sum(nF))])
 res1
#     dc tmin tmax cint wcmin wcmax wsmin wsmax gsmin gsmax  wd rmin rmax  cir lr
#1: 24   -1    4    5    -5    -2    20    25    35    40  90 11.8 26.6 14.8  3
#2: 41   -3    5    8    -8    -3    15    20    35    40  90 10.0 23.5 13.5  3
#3: 48    0    5    5    -4     0    30    35    45    50  45  7.3 19.0 11.7  6
#4: 52    3    5    2    -3     1    20    25    35    40  45  6.7 17.4 10.7  6
#5: 57   -2    5    7    -6    -1    25    30    35    40 315  4.4 13.8  9.4  7
#   lc wc    li yd   yr nF factdcx
#1:  1  3  TRUE  1 2010  2      24
#2:  1  3  TRUE  1 2010  8      41
#3:  2  3  TRUE  1 2010  0      48
#4:  2  3  TRUE  1 2010  0      52
#5:  3  3 FALSE  1 2010  0      57

res1您好,谢谢您的代码。但是,如果标称变量采用整数形式,比如a=14、b=28、c=33等等,该怎么办?谢谢你的回答。然而,我得到了一些错误,它们是这样的:“[.data.table”(集合……提供了21列来分配一个值列表(长度为2)(循环使用剩下的1项)。再次感谢。我仍然收到了警告消息:1.在“[.data.table”(setDT(df1),var1%在%c(“48”,“50”),”:=”(名称(df1)[21:22],:将“character”RHS强制为“integer”以匹配列的类型。请先将目标列更改为“character”,或将RHS强制为“integer”以明确您的意图。2.RHS包含994,超出级别范围([1,7])第2列,NAs生成。在我重试之前,我只想确认一下。数据集中有20列,除了我想求和的数值变量外,两个类别的其他列,48和50,是相等的。在这种情况下,上面的内容有用吗?如果你检查我的帖子,我不会得到这种输出。如果你有运行代码几次,可能会发生这种情况。请在原始数据集上重试。不幸的是,我仍然得到与上面相同的输出,我认为这与总和(nF)代码有关。我使用的是与dput一起发布的相同数据集。基于该数据集,即
abc1,我猜问题是我提出的数据集只是头部()是的,我的输出是基于
头(abc1)
的。我想你在完整的数据集上运行代码,所以它应该是不同的。
 res1 <- unique(setDT(abc1)[, factdcx:= as.character(factdcx)][factdcx %chin% 
   c('48','50'), c('dc', 'factdcx', 'nF') := list(48, '48', sum(nF))])
 res1
#     dc tmin tmax cint wcmin wcmax wsmin wsmax gsmin gsmax  wd rmin rmax  cir lr
#1: 24   -1    4    5    -5    -2    20    25    35    40  90 11.8 26.6 14.8  3
#2: 41   -3    5    8    -8    -3    15    20    35    40  90 10.0 23.5 13.5  3
#3: 48    0    5    5    -4     0    30    35    45    50  45  7.3 19.0 11.7  6
#4: 52    3    5    2    -3     1    20    25    35    40  45  6.7 17.4 10.7  6
#5: 57   -2    5    7    -6    -1    25    30    35    40 315  4.4 13.8  9.4  7
#   lc wc    li yd   yr nF factdcx
#1:  1  3  TRUE  1 2010  2      24
#2:  1  3  TRUE  1 2010  8      41
#3:  2  3  TRUE  1 2010  0      48
#4:  2  3  TRUE  1 2010  0      52
#5:  3  3 FALSE  1 2010  0      57
df1 <-  structure(list(dc = structure(1:6, .Label = c("24", "41",
"48", 
"50", "52", "57"), class = "factor"), tmin = c(-1L, -3L, 0L, 
0L, 3L, -2L), tmax = c(4L, 5L, 5L, 5L, 5L, 5L), cint = c(5L, 
8L, 5L, 5L, 2L, 7L), wcmin = c(-5L, -8L, -4L, -4L, -3L, -6L), 
wcmax = c(-2L, -3L, 0L, 0L, 1L, -1L), wsmin = c(20L, 15L, 
30L, 30L, 20L, 25L), wsmax = c(25L, 20L, 35L, 35L, 25L, 30L
), gsmin = c(35L, 35L, 45L, 45L, 35L, 35L), gsmax = c(40L, 
40L, 50L, 50L, 40L, 40L), wd = c(90L, 90L, 45L, 45L, 45L, 
315L), rmin = c(11.8, 10, 7.3, 7.3, 6.7, 4.4), rmax = c(26.6, 
23.5, 19, 19, 17.4, 13.8), cir = c(14.8, 13.5, 11.7, 11.7, 
10.7, 9.4), lr = c(3L, 3L, 6L, 6L, 6L, 7L), lc = c(1L, 1L, 
2L, 2L, 2L, 3L), wc = c(3L, 3L, 3L, 3L, 3L, 3L), li = c(TRUE, 
TRUE, TRUE, TRUE, TRUE, FALSE), yd = c(1L, 1L, 1L, 1L, 1L, 
1L), yr = c(2010L, 2010L, 2010L, 2010L, 2010L, 2010L), nF = c(2L, 
8L, 0L, 0L, 0L, 0L), factdcx = structure(1:6, .Label = c("24", 
"41", "48", "50", "52", "57"), class = "factor")), .Names = c("dc", 
"tmin", "tmax", "cint", "wcmin", "wcmax", "wsmin", "wsmax", "gsmin", 
 "gsmax", "wd", "rmin", "rmax", "cir", "lr", "lc", "wc", "li", 
"yd", "yr", "nF", "factdcx"), row.names = c("1:", "2:", "3:", 
"4:", "5:", "6:"), class = "data.frame")