我在替换3890个观测数据帧中的代码时遇到问题。 我的数据框有一个字符变量df $ IJN,其中包含1到27 (2除外)的值。我想用有意义的数据替换这些,如下所示
如果(1 OR 6 OR 10或14或18或22或26)应替换为 UL 。 如果(3 OR 7或11或15或19或23或27)应替换为 LL 。 如果(4 OR 8 OR 12或16或20或24)应替换为 UR 。 如果(5 OR 9或13或17或21或25)应替换为 LR 。
(U,L,R和L请参阅订单中的上,下,右和左站点)
我想到if()if()无法管理它
还想到了df [which(df ==“27”)] =“LL”可能一个接一个地工作不确定!
请帮忙。 R v3.1 - Windows 7
E-H Shabana,巴黎。
答案 0 :(得分: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用户。欢迎。当您了解社区规范时,您会更好地发帖。我要问的一件事是你努力用reproducible example更多地发展你的问题。还请use code tags。
答案 1 :(得分:1)
首先,让我们使这个例子最小化和可重复。让我们说,而不是27个IJN值,你有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
),但在大多数应用程序中这不应该是一个问题。
答案 2 :(得分:1)
您可以使用for
循环和大量if
来完成此操作,但更惯用的矢量化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")))