合并列并删除数据框中的 None
Merge columns and remove None in dataframe
它可能看起来像这些 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
我们可以使用 ifelse
将一列中的值替换为另一列中的值。还有其他方法可以做到这一点。但是,这很容易理解。使用 grep
创建用于替换的列的索引 ('indx')。
indx <- grep('^(int|dht)', names(july11))
由于列是 'factor'(来自 OP 的注释),我们可以将循环中选定的列 (lapply
) 转换为 'numeric'。非数字元素将被强制转换为 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))]
它可能看起来像这些 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
我们可以使用 ifelse
将一列中的值替换为另一列中的值。还有其他方法可以做到这一点。但是,这很容易理解。使用 grep
创建用于替换的列的索引 ('indx')。
indx <- grep('^(int|dht)', names(july11))
由于列是 'factor'(来自 OP 的注释),我们可以将循环中选定的列 (lapply
) 转换为 'numeric'。非数字元素将被强制转换为 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))]