【问题标题】:Create col Z with values from col X or Y, after removing unwanted spaces删除不需要的空格后,使用来自 col X 或 Y 的值创建 col Z
【发布时间】:2021-04-08 16:59:18
【问题描述】:

我有 col X 和 col Y。

Col X 的值带有组织名称,col Y 的值带有 col X 中相应组织的最终父名称。Col Y 的值对我来说更重要,但它有很多缺失值。

我想创建一个 col Z,其中包含 col Y 的值;但是如果 col Y 中有缺失值,那么我希望 col Z 包含 col X 的值。

编辑:我已经意识到我的 X 和 Y 列有不需要的空格,我想在创建 Z 列之前去掉这些空格。

显然,列 X 和 Y 的单元格只有空格(例如 20 个空格)。我想将这些单元格设为空白,因此我可以使用下面 akrun 提供的代码。此外,一些有用的文本值(组织名称)以两个或多个空格结尾,我也想去掉这些不需要的空格。

一个我拥有和想要拥有的例子,其中“s”代表一个空格:

抱歉以张贴图片为例(仍然无法弄清楚如何制作更舒适的数据表)。

谢谢...

【问题讨论】:

  • 关于我关于不需要的空格的问题,aromatic6tet 向我推荐了一个有用的来源 (stackoverflow.com/questions/5992082/…),在那里我发现我可以使用函数 str_squish 摆脱不需要的空格。感谢您的帮助,这个帖子可以关闭了。

标签: r dataframe


【解决方案1】:

如果列元素有NA,那么我们可以使用coalesce

library(dplyr)
df1 %>%
    mutate(Z = coalesce(Y, X))

如果这些空白是"",则替换为NA,然后使用coalecse

df1 %>%
  mutate(Z = coalecse(na_if(Y, ""), na_if(X, "")))

【讨论】:

  • 不应该是coalesce(Y,X)吗?
  • 谢谢,这可以按要求工作。但是,我意识到我的 Y 列的值比空白更复杂。显然,col Y 的单元格只有空格(例如 20 个空格)。我想将这些单元格设为空白,以便我可以使用您的代码。此外,一些有用的文本值(组织名称)以两个或多个空格结尾,我想去掉这些不需要的空格。也许您知道如何实现这一目标?这就是我所拥有和渴望拥有的,其中“s”代表一个空格:i.stack.imgur.com/jLMe0.png 非常感谢!
  • ?gsubthis SO post@KenLee
  • 非常感谢,str_squish 函数完成了这项工作!
【解决方案2】:

我过去使用dplyr::mutateifelse 的组合来完成此操作。如果有两个以上的选择,那就很棘手了。在你的情况下,因为填充空间的值应该来自 either XY,这应该适合你。


X <- list("", "Sand", "Paper", "", "Water", "Air Co Ltd")
Y <- list("", "", "", "Fire Corp", "Water Corp", "Air Corp")

df <- data.frame(cbind(X, Y))


df <- df %>% 
  dplyr::mutate(Z = ifelse(X=="", Y, X))

如果空格是 NA 则使用:

X <- list(NA, "Sand", "Paper", NA, "Water", "Air Co Ltd")
Y <- list(NA, NA, NA, "Fire Corp", "Water Corp", "Air Corp")

df <- data.frame(cbind(X, Y))


df <- df %>% 
  dplyr::mutate(Z = ifelse(is.na(X), Y, X))

如果你需要坚持使用基础 R,那么使用这个:

# if the blanks are blank
df$Z <- ifelse(X=="", Y, X)

# if the blanks are NA
df$Z <- ifelse(is.na(X), Y, X)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2014-03-13
    相关资源
    最近更新 更多