R 通过另一列中两行的相似性有条件地替换一列中的值

R 通过另一列中两行的相似性有条件地替换一列中的值,r,if-statement,conditional-statements,R,If Statement,Conditional Statements,我的数据框如下所示: Country Type Origin Transfer Weight Price 1 Belgium Export Mixed Armenia 234 5 2 Armenia Import Belgium Belgium 234 6 3 Israel Export Mixed Armenia 457 8 4 Armenia Import Mixed Israel 457 8

我的数据框如下所示:

   Country   Type  Origin Transfer Weight Price
1  Belgium Export   Mixed  Armenia    234     5
2  Armenia Import Belgium  Belgium    234     6
3   Israel Export   Mixed  Armenia    457     8
4  Armenia Import   Mixed   Israel    457     8
5 Botswana Import  Angola   Angola   2510    30
6   Angola Export  Angola Botswana   2510    35
我希望它看起来像这样(只有一个变化:混合):

代码:


df我们可以
按“权重”和用“Origin”创建的逻辑表达式排列行,按“Weight”分组,
mutate
将“Origin”更改为
第一个
元素,
解组

library(dplyr)
df <- df %>% 
  mutate(rn = row_number()) %>%
  arrange(Weight, Origin == 'Mixed') %>%
  group_by(Weight) %>% 
  mutate(Origin = first(Origin)) %>%
  ungroup %>%
  arrange(rn) %>%
  select(-rn)
库(dplyr)
df%
变异(rn=行数())%>%
排列(重量,原点=='混合')%>%
组别(按重量计)%>%
变异(起源=第一个(起源))%>%
解组%>%
排列(rn)%>%
选择(-rn)
-输出

df
# A tibble: 6 x 6
#  Country  Type   Origin  Transfer Weight Price
#  <chr>    <chr>  <chr>   <chr>     <dbl> <dbl>
#1 Belgium  Export Belgium Armenia     234     5
#2 Armenia  Import Belgium Belgium     234     6
#3 Israel   Export Mixed   Armenia     457     8
#4 Armenia  Import Mixed   Israel      457     8
#5 Botswana Import Angola  Angola     2510    30
#6 Angola   Export Angola  Botswana   2510    35
df
#一个tibble:6x6
#国家类型原产地转移重量价格
#                 
#1比利时出口比利时亚美尼亚234 5
#2亚美尼亚进口比利时234 6
#3以色列出口亚美尼亚457 8
#4亚美尼亚-以色列混合进口457 8
#5博茨瓦纳进口安哥拉2510 30
#6安哥拉出口安哥拉博茨瓦纳2510 35

我们可以
按“权重”排列
行,并使用“Origin”创建逻辑表达式,按“Weight”分组,
mutate
将“Origin”更改为
第一个
元素,
解组

library(dplyr)
df <- df %>% 
  mutate(rn = row_number()) %>%
  arrange(Weight, Origin == 'Mixed') %>%
  group_by(Weight) %>% 
  mutate(Origin = first(Origin)) %>%
  ungroup %>%
  arrange(rn) %>%
  select(-rn)
库(dplyr)
df%
变异(rn=行数())%>%
排列(重量,原点=='混合')%>%
组别(按重量计)%>%
变异(起源=第一个(起源))%>%
解组%>%
排列(rn)%>%
选择(-rn)
-输出

df
# A tibble: 6 x 6
#  Country  Type   Origin  Transfer Weight Price
#  <chr>    <chr>  <chr>   <chr>     <dbl> <dbl>
#1 Belgium  Export Belgium Armenia     234     5
#2 Armenia  Import Belgium Belgium     234     6
#3 Israel   Export Mixed   Armenia     457     8
#4 Armenia  Import Mixed   Israel      457     8
#5 Botswana Import Angola  Angola     2510    30
#6 Angola   Export Angola  Botswana   2510    35
df
#一个tibble:6x6
#国家类型原产地转移重量价格
#                 
#1比利时出口比利时亚美尼亚234 5
#2亚美尼亚进口比利时234 6
#3以色列出口亚美尼亚457 8
#4亚美尼亚-以色列混合进口457 8
#5博茨瓦纳进口安哥拉2510 30
#6安哥拉出口安哥拉博茨瓦纳2510 35

使用
ave的基本R选项

transform(
  df,
  Origin = ave(Origin,
    Weight,
    FUN = function(x) {
      ifelse(mean(x == "Mixed") == 1,
        "Mixed",
        x[x != "Mixed"]
      )
    }
  )
)
给予


使用
ave

transform(
  df,
  Origin = ave(Origin,
    Weight,
    FUN = function(x) {
      ifelse(mean(x == "Mixed") == 1,
        "Mixed",
        x[x != "Mixed"]
      )
    }
  )
)
给予


您可以使用一个helper函数来实现这一点-

library(dplyr)

replace_mixed <- function(Origin) {
  val <- Origin[Origin != 'Mixed'][1]
  if(is.na(val)) Origin else val
}

df %>%
  group_by(Weight) %>%
  mutate(Origin = replace_mixed(Origin)) %>%
  ungroup

#  Country  Type   Origin  Transfer Weight Price
#  <chr>    <chr>  <chr>   <chr>     <dbl> <dbl>
#1 Belgium  Export Belgium Armenia     234     5
#2 Armenia  Import Belgium Belgium     234     6
#3 Israel   Export Mixed   Armenia     457     8
#4 Armenia  Import Mixed   Israel      457     8
#5 Botswana Import Angola  Angola     2510    30
#6 Angola   Export Angola  Botswana   2510    35
库(dplyr)
替换_混合%
变异(原点=替换_混合(原点))%>%
解组
#国家类型原产地转移重量价格
#                 
#1比利时出口比利时亚美尼亚234 5
#2亚美尼亚进口比利时234 6
#3以色列出口亚美尼亚457 8
#4亚美尼亚-以色列混合进口457 8
#5博茨瓦纳进口安哥拉2510 30
#6安哥拉出口安哥拉博茨瓦纳2510 35

您可以使用助手函数来完成此操作-

library(dplyr)

replace_mixed <- function(Origin) {
  val <- Origin[Origin != 'Mixed'][1]
  if(is.na(val)) Origin else val
}

df %>%
  group_by(Weight) %>%
  mutate(Origin = replace_mixed(Origin)) %>%
  ungroup

#  Country  Type   Origin  Transfer Weight Price
#  <chr>    <chr>  <chr>   <chr>     <dbl> <dbl>
#1 Belgium  Export Belgium Armenia     234     5
#2 Armenia  Import Belgium Belgium     234     6
#3 Israel   Export Mixed   Armenia     457     8
#4 Armenia  Import Mixed   Israel      457     8
#5 Botswana Import Angola  Angola     2510    30
#6 Angola   Export Angola  Botswana   2510    35
库(dplyr)
替换_混合%
变异(原点=替换_混合(原点))%>%
解组
#国家类型原产地转移重量价格
#                 
#1比利时出口比利时亚美尼亚234 5
#2亚美尼亚进口比利时234 6
#3以色列出口亚美尼亚457 8
#4亚美尼亚-以色列混合进口457 8
#5博茨瓦纳进口安哥拉2510 30
#6安哥拉出口安哥拉博茨瓦纳2510 35

这很有效。谢谢你的快速回复,效果很好。谢谢你的快速回复,效果很好。谢谢你的快速回复。@Claire很高兴能得到帮助!点击左边的复选标记,您可以随意接受其中一个最适合您的答案。每个帖子只能接受一个答案。请参阅-stackoverflow.com/help/someone-answers这很有效。谢谢你的快速回复。@Claire很高兴能得到帮助!点击左边的复选标记,您可以随意接受其中一个最适合您的答案。每个帖子只能接受一个答案。请参考-stackoverflow.com/help/someone answers这可能是我的错,或者是数据集结构的结果,但是这个方法不起作用;它将所有未“混合”的原始值转换为NAs。但感谢您的快速响应。这可能是我的错误或数据集结构的结果,但此方法不起作用;它将所有未“混合”的原始值转换为NAs。但是谢谢你的快速回复。