是这样的模拟数据:定义因素,其水平依赖于另一个变量
set.seed(20120220)
x <- c(rep("a", 4), rep("b", 4))
y <- c(sample(c(1, 2), 8, replace = TRUE))
z <- data.frame(cbind(x, y))
数据帧z
看起来就像这样:
x y
1 a 1
2 a 1
3 a 1
4 a 2
5 b 2
6 b 1
7 b 2
8 b 2
我想运行到factor(z$y, levels = 1:2, labels = c("alpha", "beta"))
一个类似于,但我不不想让每个1
变成alpha
,并且每个2
变成beta
。我希望这发生只有为x = a
。如果x = b
,我想1
变成gamma
和2
变成delta
。
换句话说,我希望我的数据帧,看起来像这样:
x y
1 a alpha
2 a alpha
3 a alpha
4 a beta
5 b delta
6 b gamma
7 b delta
8 b delta
这是我想出了这么远:
for (i in 1:nrow(z)) {
if (z$x[i] == "a")
z$y[i] <- factor(z$y[i], levels = 1:2, labels = c("alpha", "beta"))
else
z$y[i] <- factor(z$y[i], levels = 1:2, labels = c("gamma", "delta"))
}
但它给了我好几个警告信息(为每个i
)是这样的:
Warning messages:
1: In `[<-.factor`(`*tmp*`, i, value = c(NA, 1L, 1L, 2L, 2L, 1L, 2L, :
invalid factor level, NAs generated
然后,当我打电话z
再次,数据帧乱七八糟,每y
已被制作成<NA>
。
我敢打赌,这是一个简单的解决方案,但我一直在尝试小时几种方法无济于事。我的头即将爆炸!帮帮我!
不能只需添加多种因素的新列级1:4和标签“阿尔法”,“测试版”,“伽马”,“三角洲”?它没有任何意义(我怀疑是可能的)有两个级别,但有4个标签的因素... – digEmAll 2012-02-20 20:37:07
我可以在一个小数据集上做到这一点,比如上面的一个,但我的实际问题有几千行,该方法不切实际。 – 2012-02-20 20:52:20
看看我的回答 – digEmAll 2012-02-20 21:17:05