繁体   English   中英

基于条件的新列

[英]New Column Based on Conditions

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

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 有点陌生,所以我不知道它是如何工作的。

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

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

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

使用 dplyr package 这是一个解决方案,它在 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 ~ "")

output,根据需要在该行上使用城市名称创建的新列。

> 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

另一种方法是:

library(dplyr)
library(tidyr)

df1 %>% 
  mutate(across(1:3, ~case_when(. %in%  df2$Cities  ~ .), .names = 'new_{col}')) %>%
  unite(New_Col, starts_with('new'), na.rm = TRUE, sep = ' ')
 Name   City  Fruit New_Col
1  Bob  Apple London  London
2 John  Paris   Pear   Paris
3 Mark Orange Madrid  Madrid
4 Will Berlin Orange  Berlin

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM