[英]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.