基于%向量R中的%的数据框列操作

时间:2017-07-13 14:44:00

标签: r dataframe

我有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")

虽然它无法显示所需的输出。

2 个答案:

答案 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