簡體   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