我有一个具有类似的多行和多列的DF。我想将viewModel = ViewModelProvider(this ).get(CommentsViewModel::class.java)
与Name
匹配。如果Name1
与Name
不匹配,我还要尝试将Name1
与Name
匹配。然后,如果匹配,我希望将Name3
的值作为新变量Name2
返回。
Namevalue
所需的输出
df
Name Name1 Name2 Name3
Natalie Shawn Edmund Natalie
Desmond Desmond James Sue
Kylie Kylie Brent Manny
我已经尝试过了:
df
Name Name1 Name2 Name3 Namevalue
Natalie Shawn Edmund Natalie Edmund
Desmond Desmond Tyler Sue Tyler
Kylie Chris Tam Kylie Tam
Leah Chewie Luke Solo Unknown
不幸的是,如果匹配不正确,它将无法正常工作。任何帮助将不胜感激。
答案 0 :(得分:2)
您的ifelse()
想法是一个好的开始,但是,您的情况略有错误,希望对您有所帮助:
代码
测试:如果name1
中的匹配项或name3
中的(|)匹配项,则分配name2
:
df$Namevalue <- ifelse(df$Name %in% df$Name1 | df$Name %in% df$Name3,
df$Name2,
NA)
#
Name Name1 Name2 Name3 Namevalue
1 Natalie Shawn Edmund Natalie Edmund
2 Desmond Desmond Tyler Sue Tyler
3 Kylie Chris Tam Kylie Tam
4 Leah Chewie Luke Solo <NA>
更新后的答案
如果想知道name1
或name3
是否匹配。
您只能首先与name1
进行匹配,
df$Namevalue <- ifelse(df$Name %in% df$Name1,
df$Name2,
NA)
#
Name Name1 Name2 Name3 Namevalue
1 Natalie Shawn Edmund Natalie <NA>
2 Desmond Desmond Tyler Sue Tyler
3 Kylie Chris Tam Kylie <NA>
4 Leah Chewie Luke Solo <NA>
然后创建一列,以显示与name1
是否匹配
df$match <- rep(NA, length(df$Namevalue))
df$match[which(!is.na(df$Namevalue))] <- "Name1"
#
Name Name1 Name2 Name3 Namevalue match
1 Natalie Shawn Edmund Natalie <NA> <NA>
2 Desmond Desmond Tyler Sue Tyler Name1
3 Kylie Chris Tam Kylie <NA> <NA>
4 Leah Chewie Luke Solo <NA> <NA>
然后与name3
匹配,并将name3
(在最后一栏中)分配给与name1
不匹配但与name3
匹配的值,
df$Namevalue <- ifelse(df$Name %in% df$Name3 & is.na(df$Namevalue),
df$Name2,
df$Namevalue)
#
df$match[which(is.na(df$match) & !is.na(df$Namevalue))] <- "Name3"
#
Name Name1 Name2 Name3 Namevalue match
1 Natalie Shawn Edmund Natalie Edmund Name3
2 Desmond Desmond Tyler Sue Tyler Name1
3 Kylie Chris Tam Kylie Tam Name3
4 Leah Chewie Luke Solo <NA> <NA>
其余NA's
在name1
或name3
中不匹配。
数据
df <- read.table(text = "
Name Name1 Name2 Name3
Natalie Shawn Edmund Natalie
Desmond Desmond Tyler Sue
Kylie Chris Tam Kylie
Leah Chewie Luke Solo", header = T, stringsAsFactor = F)
#
Name Name1 Name2 Name3
1 Natalie Shawn Edmund Natalie
2 Desmond Desmond Tyler Sue
3 Kylie Chris Tam Kylie
4 Leah Chewie Luke Solo