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。但是谢谢你的快速回复。