0

我在替换包含 3890 个观测值的数据框中的代码时遇到问题。我的数据框有一个字符变量 df$IJN ,其中包含从 1 到 27 (除了 2)的值。我想用有意义的数据替换这些,如下所示

If(1 OR 6 OR 10 OR 14 OR 18 OR 22 OR 26) 应替换为UL。If(3 OR 7 OR 11 OR 15 OR 19 OR 23 OR 27) 应替换为LL。If(4 OR 8 OR 12 OR 16 OR 20 OR 24) 应替换为UR。If(5 OR 9 OR 13 OR 17 OR 21 OR 25) 应替换为LR

(U、L、R、L 依次为上、下、右、左站点)

我想到了一个带有 if() 的 for() 无法使用它还想到了 df[which(df=="27")] ="LL" 可能一个一个不确定!请提供任何帮助。R v3.1 - Windows 7
EH Shabana,巴黎。

4

3 回答 3

2

使用 qdap 包的解决方案:

## reformatted your key
codes <- list(UL=c(1, 6, 10, 14, 18, 22, 26), 
    LL = c(3, 7, 11, 15, 19, 23, 27),
    UR = c(4, 8, 12, 16, 20, 24),
    LR = c(5, 9, 13, 17, 21, 25))

## A reproducible example
set.seed(10)
IJN <- c("UR", sample(unlist(codes,,FALSE), 20, TRUE))

## Use lookup and list2df
lookup(IJN, list2df(codes), missing = NULL)

## > IJN
##  [1] "UR" "LL" "LL" "LL" "UR" "UL" "UL" "LL" "LL" "UR"
## [11] "LL" "UR" "UR" "UL" "UR" "LL" "LL" "UL" "UL" "LL"
## [21] "LR"

最后一行索引以查找 IJN 向量中与键匹配的值并仅替换它们。 lookup是一个环境哈希,所以它非常快。

我看到你是一个新的 SO 用户。欢迎。当您了解社区的规范时,您会在发帖方面做得更好。我要问的一件事是,您要努力通过可重复的示例来更多地解决您的问题。请同时使用代码标签

于 2013-06-26T16:10:05.640 回答
1

你可以用一个for循环和很多ifs 来做到这一点,但更惯用的矢量化 R 方法是使用ifelse

dj$IJN <- ifelse(dj$IJN %in% c(1, 6, 10, 14, 18, 22, 26), "UL",
          ifelse(dj$IJN %in% c(3, 7, 11, 15, 19, 23, 27), "LL",
          ifelse(dj$IJN %in% c(4, 8, 12, 16, 20, 24, 28), "UR", "LR"))) 
于 2013-06-26T16:12:23.297 回答
1

首先,让我们使这个例子最小化和可重现。假设 IJN 的值不是 27 个,而是 3 个。值 1 被替换为“LL”,值 2 和 3 被替换为“UL”。我会把它们放在一个 1 列的数据框中

d <- data.frame(IJN = round(runif(n=10, min=1, max=3)))

现在,我们将设置第二个数据框,每个可能的 IJN 值恰好出现一次,其对应的标签位于单独的列中:

refDF <- data.frame(IJN = 1:3, nm=c("LL", "UL", "UL"))

最后,将它们合并到一个数据框中:

d2 <- merge(d, refDF, by="IJN")

请注意,这并不能完全回答您的问题:我没有替换列的值,而是添加了一个具有不同名称的新列,其值对应于您的值。请注意,merge它还会对列的行进行重新排序(by在这种情况下对列进行排序df$IJN),但这在大多数应用程序中应该不是问题。

于 2013-06-26T16:01:07.290 回答