【问题标题】:how to count the numbers based on two columns如何根据两列计算数字
【发布时间】:2017-11-21 20:09:11
【问题描述】:

我有这样的数据

df <- structure(list(V1 = structure(c(2L, 4L, 4L, 2L, 4L, 4L, 4L, 4L, 
1L, 1L, 1L, 1L, 3L, 2L, 2L, 4L, NA, 2L, 2L, 2L, 2L, 4L, 5L, 5L, 
5L, NA, NA, 4L), .Label = c("", "1 x Bruit (U)", "1 x TAMAN (M)", 
"2 x Bruit (U)", "2 x TIKIam(T)"), class = "factor"), V2 = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L), .Label = c("BUX1_T10963", 
"BUX1_T10964", "BUX1_T10965", "BUX1_T10966", "BUX2_T10076"), class = "factor")), .Names = c("V1", 
"V2"), class = "data.frame", row.names = c(NA, -28L))

我尝试做一个例子,以便更好地帮助我

前两列是这样的

1 x 布鲁特 (U) BUX1_T10963 2 x 布鲁特 (U) BUX1_T10963 2 x 布鲁特 (U) BUX1_T10963

这里我想知道有多少 BUX1_T10963 有Bruit (U),有多少没有。或有其他东西或空单元格

例如上面的例子,答案是

BUX1_T10963 有 5 个布鲁特 (U)

输出如下所示

                  BUX1_T10963      
Bruit (U)               5
NA                      0
.                       0
.                       0

@d.b 给出了类似

的答案
table(df$V1, df$V2)

                BUX1_T10963 BUX1_T10964 BUX1_T10965 BUX1_T10966 BUX2_T10076
                          0           4           0           0           0
  1 x Bruit (U)           1           1           2           4           0
  1 x TAMAN (M)           0           0           1           0           0
  2 x Bruit (U)           2           4           1           1           1
  2 x TIKIam(T)           0           0           0           3           0

但它并没有像上面的格式那样显示分配给它们的空的数量,并且还计算了不同于 1 的 2

table(replace(gsub("(\\d x )", "", df$V1), is.na(df$V1), "NA"), df$V2)

            BUX1_T10963 BUX1_T10964 BUX1_T10965 BUX1_T10966 BUX2_T10076
                      0           4           0           0           0
  Bruit (U)           3           5           3           5           1
  NA                  0           0           1           2           0
  TAMAN (M)           0           0           1           0           0
  TIKIam(T)           0           0           0           3           0


BUX1_T10963 should have 4 empty 
BUX1_T10965 should have 1
BUX1_T10966 should have 2

有没有办法在同一个原料上制作它?

【问题讨论】:

  • @d.b 表不计算空位,使 2 与 1 分开。让我显示上面的输出
  • 或者只是with(df, table(V1, V2, useNA = "ifany")),同样,带有空白标签的第一行是空白数。
  • @d.b 有没有办法让它们在同一行?请看上面
  • 所以您希望NA 和空白"" 被同等对待?只需先运行df[df == ""] = NA 将所有空白更改为NA
  • @d.b 因为数据结构有问题,由 df[df == ""] 解决

标签: r


【解决方案1】:

table 命令做你想做的事:

table(df$V1, df$V2, useNA = "ifany")

表格适用于所有不同的值。如果您希望空白 "" 等同于缺失值 NA,则需要对数据进行更改:

df[df == ""] = NA

同样,如果 1 x2 x 无关紧要,请摆脱它们。也许添加一个新列

df$goodname = gsub(pattern = "^[0-9]+ x ", replacement = "", x = df$V1)

table(df$goodname, df$V2, useNA = "ifany")
            BUX1_T10963 BUX1_T10964 BUX1_T10965 BUX1_T10966 BUX2_T10076
  Bruit (U)           3           5           3           5           1
  TAMAN (M)           0           0           1           0           0
  TIKIam(T)           0           0           0           3           0
  <NA>                0           4           1           2           0

将数量提取到自己的列中并制表:

library(stringr)
# extract the number
df$quantity = as.numeric(str_extract(df$V1, "^[0-9]+"))
# any missing values assume to be 1
df$quantity[is.na(df$quantity)] = 1

library(reshape2)
dcast(data = df, formula = goodname ~ V2, value.var = "quantity", fun.aggregate = sum, na.rm = T)
#    goodname BUX1_T10963 BUX1_T10964 BUX1_T10965 BUX1_T10966 BUX2_T10076
# 1 Bruit (U)           5           9           4           6           2
# 2 TAMAN (M)           0           0           1           0           0
# 3 TIKIam(T)           0           0           0           6           0
# 4      <NA>           0           4           1           2           0

【讨论】:

  • 我认为您的其他问题过于宽泛。这个问题向您展示了如何从一个好的数据格式变成一个好的表格,然后向您展示了如何从一个稍微糟糕的数据格式变成一个好的数据格式。原来你的数据是更糟糕的数据格式。您的另一个问题是“我如何将这种非常糟糕的数据格式带到一个漂亮的表格中?”,但您应该问的是“我如何将这种非常糟糕的数据格式变成一个好的数据格式?",因为您已经从这个问题中知道了如何从好的数据到好的表。
  • 您的其他问题根本不应该提及这张桌子 - 它只会分散注意力并让人感到困惑。而是专注于如何将复合行分解为具有项目名称列和数量列的单独行。并确保您的示例数据与您需要的一样通用 - 可能连续三个项目?更多的?我认为如果你这样做,显示示例输入和所需的输出(只是好的数据,忘记表格),你会得到很好的快速帮助。这周我很忙,所以可能不会来自我。
猜你喜欢
  • 2019-07-31
  • 2015-09-30
  • 1970-01-01
  • 2020-10-13
  • 2016-12-05
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多