【问题标题】:Selecting a unique value from an R data frame从 R 数据框中选择唯一值
【发布时间】:2015-07-09 16:40:59
【问题描述】:

如果我有这样的表:

| FileName | Category| Value | Number |
|:--------:|:-------:|:-----:|:------:|
| File1    | Time    | 123   | 1      |
| File1    | Size    | 456   | 1      |
| File1    | Final   | 789   | 1      |
| File2    | Time    | 312   | 2      |
| File2    | Size    | 645   | 2      |
| File2    | Final   | 978   | 2      |
| File3    | Time    | 741   | 1      |
| File3    | Size    | 852   | 1      |
| File3    | Final   | 963   | 1      |
| File1    | Time    | 369   | 2      |
| File1    | Size    | 258   | 2      |
| File1    | Final   | 147   | 2      |
| File3    | Time    | 741   | 2      |
| File3    | Size    | 734   | 2      |
| File3    | Final   | 942   | 2      |
| File1    | Time    | 997   | 3      |
| File1    | Size    | 245   | 3      |
| File1    | Final   | 985   | 3      |
| File2    | Time    | 645   | 3      |
| File2    | Size    | 285   | 3      |
| File2    | Final   | 735   | 3      |
| File3    | Time    | 198   | 3      |
| File3    | Size    | 165   | 3      |
| File3    | Final   | 753   | 3      |

我可以在 R 脚本中使用什么方法来为每个 FileName 声明一个变量 Value,其中 Number最小值CategoryTime

(编辑: 需要注意的是 null 条目在 Value 列。因此,应该构造此代码以将空条目视为不存在,因此 New Column 最终不会被填充 NA 价值观。)

然后我想merge 这个在现有表上形成一个新列,现在它看起来像这样:

| FileName | Category | Value | Number | New Column |
|:--------:|:--------:|:-----:|:------:|------------|
| File1    | Time     | 123   | 1      | 123        |
| File1    | Size     | 456   | 1      | 123        |
| File1    | Final    | 789   | 1      | 123        |
| File2    | Time     | 312   | 2      | 312        |
| File2    | Size     | 645   | 2      | 312        |
| File2    | Final    | 978   | 2      | 312        |
| File3    | Time     | 741   | 1      | 741        |
| File3    | Size     | 852   | 1      | 741        |
| File3    | Final    | 963   | 1      | 741        |
| File1    | Time     | 369   | 2      | 369        |
| File1    | Size     | 258   | 2      | 369        |
| File1    | Final    | 147   | 2      | 369        |
| File3    | Time     | 741   | 2      | 741        |
| File3    | Size     | 734   | 2      | 741        |
| File3    | Final    | 942   | 2      | 741        |
| File1    | Time     | 997   | 3      | 997        |
| File1    | Size     | 245   | 3      | 997        |
| File1    | Final    | 985   | 3      | 997        |
| File2    | Time     | 645   | 3      | 645        |
| File2    | Size     | 285   | 3      | 645        |
| File2    | Final    | 735   | 3      | 645        |
| File3    | Time     | 198   | 3      | 198        |
| File3    | Size     | 165   | 3      | 198        |
| File3    | Final    | 753   | 3      | 198        |

【问题讨论】:

  • 阅读基本的 R 文档。 subsetmin== 等函数将用于解决此问题。
  • @Frank 我对这些很熟悉。但是,我似乎无法在所有不同的条件下得出逻辑。
  • dplyr , data.table 包或来自 baseR 的 tapply
  • @BondedDust:我认为OP的意思是变量Measure的类别时间。
  • 还在摸不着头脑。所以测量列只是被重命名为时间?还是有一些数据可以合并?

标签: r


【解决方案1】:

使用data.table:

(已编辑以反映 @Frank 的 cmets)

DT[, Benchmark := Value[Category == "Time"][which.min(Number[Category == "Time"])], by = FileName]

分解:

Number[Category == "Time"]

  • 取所有Number 其中Category == Time

which.min(^^^)

  • 找出哪一个是最小值

Benchmark := Value[Category == "Time"][^^^]

  • 将新的基准列设置为此最小值

by = FileName

  • 按组执行此操作

【讨论】:

  • 我正在使用这个 data.table 进行测试:DT <- data.table(Value = 1:10,Measure = c("Batch Time","Other"), Number = 1:5, group = letters[1:3]),然后DT[, Benchmark := Value[which.min(Number[Measure == "Batch Time"])], by = group] 为我工作。后面的代码是否正是通过 R 运行的代码?
  • @David Fair,但您得到的错误与 data.table 的内容无关。请参阅:stackoverflow.com/questions/25889234/…。因为我没有收到那个错误,所以很可能是在传输到您的 rscript 时出错
  • @David 你在复制时错过了右括号]
  • @David Testdf 不是 data.table 那么。您需要使用library(data.table),然后使用setDT(Testdf)
  • 对不起应该是文件名
【解决方案2】:

未经测试,但应该可以帮助您入门:

Ref <- Table1 %>%
  mutate(Category2 = factor(Category, c("Time", "Size", "Final"),
    FileNumber = as.numeric(sub("File", "", FileName)),
    FilePrefix = "File") %>%
  arrange(FilePrefix, FileNumber, Category2, Value) %>%
  group_by(FilePrefix, FileNumber, Category2) %>%
  mutate(NewColumn = Value[1])

【讨论】:

  • 这是您的第一张桌子。你没有给它起名字,所以我把它命名为表 1。
  • 好吧,这就是我的假设。我想确定一下。当您通过列出不同的类别条目来考虑Category 时,如果类别名称的分布不相等,会有所不同吗?例如,File1 可能有 TimeSizeFinal,而 File2 可能只有 TimeFinal,而 File3 可能有 TimeSizeSpaceFinal
  • 我认为这取决于你是否想要它。任何未命名的级别都将被分配缺失。当数据框排序时,它将缺失值推到最后。因此,如果您不关心保留价值,那么不,没关系。如果你想要这些信息,那就有问题了。一种更安全的方法(我一开始就应该提到)是mutate(Category2 = factor(Category......)。然后你仍然有原始数据。我会编辑答案。
  • 当我运行这个时,我得到Error: could not find function "%&gt;%"。我以为我以前见过它,但我找不到任何关于该运算符是什么的文档。
  • 另外,当我查看对象 ref 时,它只是一个带有 FileName 和 NewColumn 的数据框。
猜你喜欢
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多