【问题标题】:How to separate one column into two based on the criteria of other columns如何根据其他列的条件将一列分成两列
【发布时间】:2017-05-31 18:27:30
【问题描述】:

我有一个这样的数据框:

Category <-c("Agriculture","Education","Education","Energy","Environment","Finance","Governance","Governance","Economics","Economics","Equality","Society" , "Protection","Trade","Trade","Trade", "Transport","Transport","Water")
Value <- c(0.00e+00, 8.75e+08, 0.00e+00, 0.00e+00, 0.00e+00, 0.00e+00, 8.30e+08, 0.00e+00, 5.00e+08, 0.00e+00, 0.00e+00, 3.50e+08, 0.00e+00, 2.20e+08, 3.00e+08, 0.00e+00, 5.06e+08,0.00e+00, 3.50e+08)
Prod_A <- c(NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA)
Prod_B <- c(NA, 3, NA, NA, NA, NA, 2, NA, NA, NA, NA, 1, NA, 3, NA, NA, 2, NA, 1)
df <- data.frame(Category, Value, Prod_A, Prod_B) 
df
 Category    Value     Prod_A    Prod_B
1  Agriculture 0.00e+00   NA     NA
2  Education 8.75e+08     NA      3
3  Education 0.00e+00     NA     NA
4  Energy 0.00e+00        NA     NA
5  Environment 0.00e+00   NA     NA
6  Finance 0.00e+00       NA     NA
7  Governance 8.30e+08    NA      2
8  Governance 0.00e+00    NA     NA
9  Economics 5.00e+08      1     NA
10 Economics 0.00e+00     NA     NA
11 Equality 0.00e+00      NA     NA
12 Society 3.50e+08       NA      1
13 Protection 0.00e+00    NA     NA
14 Trade 2.20e+08         NA      3
15 Trade 3.00e+08          2     NA
16 Trade 0.00e+00         NA     NA
17 Transport 5.06e+08     NA      2
18 Transport 0.00e+00     NA     NA
19 Water 3.50e+08         NA      1

“值”列是产品 A 或产品 B 的 sum_value。

'Prod_A' 和 'Prod_B' 是产品的数量。

我想做的是将产品 B 的值从列“值”中分离出来,并使其成为一个新列,这样这两个产品的 sum_value 就不会在一个列中混合在一起。我怎样才能做到这一点?

我使用的是 spread(df, Value, Prod_B) 但它显然是错误的...
任何帮助将不胜感激!谢谢!!

【问题讨论】:

  • Prod_B / Prod_A 中的值是什么意思?他们是团体吗?有没有Prod_A/B 都不是NA 的情况?现在我们真的需要更多关于数据的信息来了解如何最好地解决问题
  • 话虽如此,我想你想要的是这样的:df$Value_B &lt;- ifelse(!is.na(Prod_B), Value, NA)
  • @MikeH。 Prod_A 中的值是产品类型 A 中产品的计数,在 Prod_B 中相同。它是一个平面表,这意味着在每一行中,列“Prod_A”和“Prod_B”不会同时具有值​​。如果“Prod_A”中有多个产品计数,“Value”中对应的值表示“Prod_A”的sum_value。
  • 感谢您的澄清!我想我上面贴的ifelse()应该是你想要的吧?
  • @MikeH。感谢您的解决方案。但是如何从“Value”中删除“Value_B”,以便将“Value”重命名为“Value_A”。

标签: r dplyr data-cleaning


【解决方案1】:

使用 data.table,这应该可以完成工作:

# convert df to data.table if it is necesary:
library(data.table)
df <- data.table(df)

head(df)

      Category    Value Prod_A Prod_B
1: Agriculture 0.00e+00     NA     NA
2:   Education 8.75e+08     NA      3
3:  Governance 8.30e+08     NA      2
4:   Economics 5.00e+08      1     NA
5:       Trade 2.20e+08     NA      3
6:       Trade 3.00e+08      2     NA
# generate value_A and value_B as needed:

df <- df[is.na(Prod_A) & !is.na(Prod_B), value_B := Value,][is.na(Prod_B) & !is.na(Prod_A), value_A:=Value]

head(df)

       Category    Value Prod_A Prod_B  value_B value_A
1: Agriculture 0.00e+00     NA     NA       NA      NA
2:   Education 8.75e+08     NA      3 8.75e+08      NA
3:  Governance 8.30e+08     NA      2 8.30e+08      NA
4:   Economics 5.00e+08      1     NA       NA   5e+08
5:       Trade 2.20e+08     NA      3 2.20e+08      NA
6:       Trade 3.00e+08      2     NA       NA   3e+08

请注意,当 Prod_A 和 Prod_B 为“NA”时,脚本将 value_A 和 value_B 分配为“NA”。

【讨论】:

    猜你喜欢
    • 2019-11-22
    • 1970-01-01
    • 2021-08-30
    • 2018-11-06
    • 2020-06-02
    • 2013-12-19
    • 2022-09-30
    • 2021-01-26
    • 2019-06-27
    相关资源
    最近更新 更多