基于另一列中的4个值创建新列
我想根据另一列中的4个值创建一个新列。基于另一列中的4个值创建新列
if col1=1 then col2= G;
if col1=2 then col2=H;
if col1=3 then col2=J;
if col1=4 then col2=K.
如何在R中执行此操作? 请帮我解决这个问题。我试过如果/ else和ifelse,但似乎没有工作。谢谢
你有一个特殊的情况,在索引是1:4的整数时查找值。这意味着您可以使用向量索引来轻松解决您的问题。
首先,创建一些示例数据:
set.seed(1)
dat <- data.frame(col1 = sample(1:4, 10, replace = TRUE))
接下来,定义查找值,并使用[
子集以找到期望的结果:
values <- c("G", "H", "J", "K")
dat$col2 <- values[dat$col1]
结果:
dat
col1 col2
1 2 H
2 2 H
3 3 J
4 4 K
5 1 G
6 4 K
7 4 K
8 3 J
9 3 J
10 1 G
更一般地,你可以使用[
子集与match
相结合来解决这样的问题:
index <- c(1, 2, 3, 4)
values <- c("G", "H", "J", "K")
dat$col2 <- values[match(dat$col1, index)]
dat
col1 col2
1 2 H
2 2 H
3 3 J
4 4 K
5 1 G
6 4 K
7 4 K
8 3 J
9 3 J
10 1 G
有很多方法可以做到这一点,但这里有一个。
set.seed(357)
mydf <- data.frame(col1 = sample(1:4, 10, replace = TRUE))
mydf$col2 <- rep(NA, nrow(mydf))
mydf[mydf$col1 == 1, ][, "col2"] <- "A"
mydf[mydf$col1 == 2, ][, "col2"] <- "B"
mydf[mydf$col1 == 3, ][, "col2"] <- "C"
mydf[mydf$col1 == 4, ][, "col2"] <- "D"
col1 col2
1 1 A
2 1 A
3 2 B
4 1 A
5 3 C
6 2 B
7 4 D
8 3 C
9 4 D
10 4 D
这是一个使用car
的recode
。
library(car)
mydf$col3 <- recode(mydf$col1, "1 = 'A'; 2 = 'B'; 3 = 'C'; 4 = 'D'")
还有一个从this question:
mydf$col4 <- c("A", "B", "C", "D")[mydf$col1]
你可以看看?symnum
。
在你的情况,是这样的:
col2<-symnum(col1, seq(0.5, 4.5, by=1), symbols=c("G", "H", "J", "K"))
应该让你关闭。
你可以使用嵌套ifelse
:
col2 <- ifelse(col1==1, "G",
ifelse(col1==2, "H",
ifelse(col1==3, "J",
ifelse(col1==4, "K",
NA )))) # all other values map to NA
在它的矫枉过正,这个简单的例子,但对于更复杂那些...
“但对于更复杂的......” - 更复杂的嵌套'ifelse'是更好的**想法?这对我来说是违反直觉的。 –
@TheRedPea对于更复杂的条件,基于不同的列,不相关的对方等等。 – Marek
是的,我想人们可能没有选择,只能用if语句表达逻辑。 –
你使用什么编程语言? –
@TheGiG OP用[tag:r]标记了问题 – Andrie
高度相关:[case statement equivalent](http://*.com/q/4622060/168747),[如何在数据中添加列。框架?](http://*.com/q/4562547/168747),[在Excel表格中的数据清理](http://*.com/q/7374314/168747)(在另一组链接中)。 – Marek