【问题标题】:R programming - data frame manoevurR 编程 - 数据框操作
【发布时间】:2015-06-26 06:18:15
【问题描述】:

假设我有以下数据框:

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

还是有问题,先生/女士:

 > head(abc1 (updated))
   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
6: 70   -2    3    5    -4    -1    20    25    30    35 360  3.6 10.2  6.6  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 57      48
4:  2  3  TRUE  1 2010  0      52
5:  3  3 FALSE  1 2010  0      57
6:  3  2  TRUE  1 2010  1      70

nF 的和不正确,应该为零。

【问题讨论】:

  • 如果你查看我的帖子,我没有得到那种输出。如果你已经运行了几次代码,它可能会发生。在您的原始数据集上再试一次。
  • 不幸的是,我仍然得到与上面相同的输出,我认为这与 sum(nF) 代码有关。
  • 我使用的数据集与您在 dput 中发布的数据集相同。基于该数据集,即。 abc1 &lt;- structure(..,我得到0 代表nF,你在其中显示了57
  • 我猜的问题是我提出的数据集只是它的head()。完整的数据集要长得多。那会有什么不同吗?
  • 是的,我的输出基于head(abc1)。我认为您在完整数据集上运行代码,所以应该有所不同。

标签: r data-structures dataset


【解决方案1】:

试试

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

数据

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

【讨论】:

  • 您好,感谢您的代码。但是,如果名义变量采用整数形式,比如 a=14、b=28、c=33 等呢?
  • 感谢您的回复。但是,我遇到了一些错误,他们去:
  • 在 '[.data.table'(set...... 提供 21 列以分配一个列表(长度为 2)的值(回收剩下 1 个项目)。
  • 再次感谢。我仍然收到警告消息: 1. 在 '[.data.table'(setDT(df1),var1%in%c("48","50"),':='(names(df1)[21:22 ],: 将“字符”RHS 强制转换为“整数”以匹配列的类型。首先将目标列更改为“字符”或将 RHS 强制转换为“整数”以明确您的意图。2.RHS 包含 994,它在第 2 列的级别范围([1,7]),生成 NA。
  • 在我重试之前,我只是想确认一下。我在数据集中有 20 列,除了我想求和的数字变量之外,2 个类别的其他列 48 和 50 是相等的。在这种情况下,上述内容是否有用。
猜你喜欢
  • 2021-06-28
  • 2021-06-28
  • 2015-09-19
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2020-11-20
  • 2020-07-22
  • 1970-01-01
相关资源
最近更新 更多