我有2个原子载体:
mcc <- as.character(c(1:10))
ctyc <- as.character(c(2:11))
我有一个数据框:
xmcc <- as.character(c(8:12))
xctyc <- as.character(c(1:4,12))
df <- data.frame(xmcc, xctyc)
colnames(df) <- c("mcc", "ctyc")
mcc ctyc
1 8 1
2 9 2
3 10 3
4 11 4
5 12 12
我想要的输出是: 逻辑是,如果数据帧中的mcc确实存在于向量mcc中,则它将返回mcc,否则为9999。列ctyc的逻辑相同
mcc ctyc mccNew ctycNew
1 8 1 8 999
2 9 2 9 2
3 10 3 10 3
4 11 4 9999 4
5 12 12 9999 999
我的尝试:
df$mccNew <- ifelse(df$mcc %in% mcc, df$mcc, "9999")
df$ctycNew <- ifelse(df$ctyc %in% ctyc, df$ctyc, "999")
虽然它无法显示所需的输出。
答案 0 :(得分:0)
我们可以使用匹配来完成此任务:
A match B
:产生一个索引向量,其中index [i]表示B中与A [i]匹配的位置,如果不是,则表示NA
。 所以:
> matchedIndex.mcc <- match(df$mcc, mcc)
> matchedIndex.ctyc <- match(df$ctyc, ctyc)
> df$mccNew <- ifelse(!is.na(matchedIndex.mcc), mcc[matchedIndex.mcc], 9999)
> df$ctycNew <- ifelse(!is.na(matchedIndex.ctyc), ctyc[matchedIndex.ctyc], 9999)
> df
mcc ctyc mccNew ctycNew
1 8 1 8 9999
2 9 2 9 2
3 10 3 10 3
4 11 4 9999 4
5 12 12 9999 9999
答案 1 :(得分:0)
您可以使用Map
将这两个变量添加到一行中,就像这样
df[c("mccNew", "ctycNew")] <- Map(function(x, y) ifelse(x %in% y, x, "9999"),
df, list(mcc, ctyc))
这里,左侧提供了带有变量名称的插槽,以添加到data.frame。右侧在两个列表的元素之间并行运行,data.frame变量列表和用于检查的向量列表。 Map
输出一个长度等于两个列表参数的列表,每个列表元素包含一个df行长度的向量。请注意,如果您的data.frame有更多变量,您将希望将第二个参数中感兴趣的变量子集到Map
。
返回
df
mcc ctyc mccNew ctycNew
1 8 1 4 9999
2 9 2 5 3
3 10 3 1 4
4 11 4 9999 5
5 12 12 9999 9999