【问题标题】:Merge columns and remove None in dataframe合并列并删除数据框中的无
【发布时间】:2015-07-15 14:16:37
【问题描述】:

这似乎与这些 two questions 重复,但找​​不到不涉及删除列、连接然后将它们重新插入数据框的解决方案(这很长曲折的方式,我只能设法产生)。

我想删除“dht_t”列并将其非 NA 或“None”行与“int_t”合并。这些 dht 列包含与 int_t 相同的数据,但时间戳不同。我想合并这些行。

dht_t/h 来自与 int_t/h 相同的传感器,但对于某些数据集被放在额外的行中。

 head(july11)
                 time hive_id int_t int_h dht_t dht_h     hz     db     pa
1 2015-07-11 00:00:01   hive1  25.3  50.1  None  None 136.72 39.443 100849
2 2015-07-11 00:00:22   hive1  25.3  50.3  None  None    NaN 39.108 100846
3 2015-07-11 00:00:43   hive1  25.3  50.3  None  None    NaN 39.451 100835
4 2015-07-11 00:01:04   hive1  25.3  50.3  None  None    NaN 39.145 100849
5 2015-07-11 00:01:25   hive1  25.3  50.3  None  None    NaN 39.357 100844
6 2015-07-11 00:01:46   hive1  25.3  50.7  None  None    NaN 39.284 100843

这是应该将 dht_t/h 值移动到 int_t/h 列的数据部分

并且输出没有 dht_t 和 dht_h

               time hive_id int_t int_h    hz     db     pa
1 2015-07-11 00:00:01   hive1  25.3  50.1  136.72 39.443 100849
2 2015-07-11 00:00:22   hive1  25.3  50.3  NaN    39.108 100846
3 2015-07-11 00:00:43   hive1  25.3  50.3  NaN    39.451 100835
4 2015-07-11 00:01:04   hive1  25.3  50.3  NaN    39.145 100849
5 2015-07-11 00:01:25   hive1  25.3  50.3  NaN    39.357 100844
6 2015-07-11 00:01:46   hive1  25.3  50.7  NaN    39.284 100843

【问题讨论】:

  • 您也可以发布预期的输出吗?在示例中,所有行都为None,对应dht_t。试试july11$dht_t <- with(july11, ifelse(is.na(dht_t)|dht_t=='None', int_t, dht_t))
  • 是的,已修改,谢谢您的建议。
  • 澄清一下,dht_t/h。所有其他荨麻疹都没有。
  • 我认为根据图像显示它必须是ifelse 解决方案,即july11$int_t <- with(july, ifelse(is.na(int_t)|int_t=='None', dht_t, int_t),同样适用于int_h 列。不过,这可以使用Map 循环。
  • 第一条注释中的代码将不正确的值转移到了 dht_t 列,也就是要删除的列。并为 july11$int_t 尝试也导致了奇怪的值

标签: r concat


【解决方案1】:

我们可以使用ifelse 将一列中的值替换为另一列。还有其他方法可以做到这一点。但是,这很容易理解。使用 grep 创建用于替换的列的索引 ('indx')。

indx <- grep('^(int|dht)', names(july11))

由于列是“因子”(来自 OP 的 cmets),我们可以将循环中的选定列 (lapply) 转换为“数字”。非数字元素将被强制转换为NAs

july11[indx] <- lapply(july11[indx], function(x) as.numeric(as.character(x)))

我们将 'int_t/int_h' 中的 NA 值替换为 'dht_t/dht_h' 中的值

july11$int_t <- with(july11, ifelse(is.na(int_t), dht_t, int_t))
july11$int_h <- with(july11, ifelse(is.na(int_h), dht_h, int_h))

并从数据集中删除“dht”列。

july11N <- july11[-grep('^dht', colnames(july11))] 

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 2011-11-18
    • 2017-05-31
    • 2021-12-17
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多