【问题标题】:New Column Based on Conditions基于条件的新列
【发布时间】:2022-11-27 12:32:25
【问题描述】:

为了设置场景,我有一组数据,其中两列数据混合在一起。举个简单的例子:

df1 <- data.frame(Name = c("Bob", "John", "Mark", "Will"), City=c("Apple", "Paris", "Orange", "Berlin"), Fruit=c("London", "Pear", "Madrid", "Orange"))
df2 <- data.frame(Cities = c("Paris", "London", "Berlin", "Madrid", "Moscow", "Warsaw"))

结果,我们有两个小数据集:

> df1
  Name   City  Fruit
1  Bob  Apple London
2 John  Paris   Pear
3 Mark Orange Madrid
4 Will Berlin Orange

> df2
  Cities
1  Paris
2 London
3 Berlin
4 Madrid
5 Moscow
6 Warsaw

我的目标是使用 df2 创建一个新的列,其中城市位于正确的位置。我对 R 有点陌生,所以我不知道它是如何工作的。

我真的不知道从哪里开始解决这类问题。我的完整数据集要大得多,最好有一种有效的方法来解决这个问题!

【问题讨论】:

    标签: r


    【解决方案1】:

    如果“城市”值只是不同。我们可以循环遍历行,基于与来自“df2”的“Cities”的匹配值创建一个逻辑向量,并通过获取顺序中第二个匹配值来与其余值连接

    df1[] <- t(apply(df1, 1, function(x) 
              {
             i1 <- x %in% df2$Cities
              i2 <- !i1
              x1 <- x[i2]
            c(x1[1], x[i1], x1[2])}))
    

    -输出

    > df1
      Name   City  Fruit
    1  Bob London  Apple
    2 John  Paris   Pear
    3 Mark Madrid Orange
    4 Will Berlin Orange
    

    【讨论】:

      【解决方案2】:

      使用 dplyr 包这是一个解决方案,它在 df1 中查找两个 City 和 Fruit 值,并采用 df2 城市列表中存在的那个。 如果两者都不是城市名称,则返回一个空字符串,您可以将其替换为您喜欢的任何内容。

      library(dplyr)
      df1$corrected_City <- case_when(df1$City%in%df2$Cities ~ df1$City,
                                      df1$Fruit%in%df2$Cities ~ df1$Fruit,
                                      TRUE ~ "")
      

      输出

      > df1
        Name   City  Fruit corrected_City
      1  Bob  Apple London         London
      2 John  Paris   Pear          Paris
      3 Mark Orange Madrid         Madrid
      4 Will Berlin Orange         Berlin
      

      【讨论】:

        猜你喜欢
        • 2021-11-16
        • 2021-11-07
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多