首页 > 解决方案 > 根据先前列的结果在 R 中创建一个新列

问题描述

我正在尝试根据前两列在表中创建一个新列。我的两列包含逻辑变量,我希望我的新列是基于这些逻辑变量的列(因此,如果两列中的答案都是错误的,那么它们是第 1 组的一部分,如果他们在选择 1 中回答错误但在选择 2 中回答正确然后他们是第 2 组的一部分等)

我的数据表如下所示:

Choice1  Choice2 
TRUE     FALSE     
TRUE     TRUE      
FALSE    FALSE     
FALSE    TRUE      
TRUE     TRUE      

我想创建一个新列,将个人分为 4 个组之一:1、2、3、4。

1=假,假

2=假真

3=真假

4=真真

所以上表的结果是 3,4,1,2,4

我最初尝试了一个代码,它开始看起来像我在下面所做的,但目前这不适用于代码。

df$newcolumn <- c("(df$Choice1=FALSE,df$Choice2=FALSE)"="1", "(df$Choice1=FALSE, df$Choice2=TRUE)"="2"), "(df$Choice1=TRUE, df$Choice2=FALSE)"="3", "(df$Choice1=TRUE, df$Choice2=TRUE)", ="4")

我也尝试在网上寻找其他合适的类似示例来尝试调整我的示例,但一直没有找到。任何帮助,将不胜感激

标签: r

解决方案


1) 线性公式所示公式将给出组数作为因子。在下面的评论中要求因素部分。

transform(dat1, group = factor(1 + 2*Choice1 + Choice2))
##   Choice1 Choice2 group
## 1    TRUE   FALSE     3
## 2    TRUE    TRUE     4
## 3   FALSE   FALSE     1
## 4   FALSE    TRUE     2
## 5    TRUE    TRUE     4

我们可以使用回归推导出上述公式。为此,必须在 dat1 中表示每个组合,但实际上就是这样。

y <- c(3, 4, 1, 2, 4)
fm <- lm(y ~., dat1)
fm
##
## Call:
## lm(formula = y ~ ., data = dat1)
##
## Coefficients:
## (Intercept)  Choice1TRUE  Choice2TRUE  
##           1            2            1  

# check that it is exact, i.e. residual sum of squares is 0
deviance(fm)
## [1] 3.574526e-31

2)显式组合另一种方法是显式考虑每个组合:

transform(dat1, group = factor(
  1 * (!Choice1 & !Choice2) +
  2 * (!Choice1 & Choice2) + 
  3 * (Choice1 & !Choice2) + 
  4 * (Choice1 & Choice2)))

给予:

  Choice1 Choice2 group
1    TRUE   FALSE     3
2    TRUE    TRUE     4
3   FALSE   FALSE     1
4   FALSE    TRUE     2
5    TRUE    TRUE     4

3)交互第三种方法是使用interaction创建组因子。

transform(dat1, group = factor(interaction(Choice2, Choice1), label = ""))

给予:

  Choice1 Choice2 group
1    TRUE   FALSE     3
2    TRUE    TRUE     4
3   FALSE   FALSE     1
4   FALSE    TRUE     2
5    TRUE    TRUE     4

笔记

可重现形式的输入是:

dat1 <- structure(list(Choice1 = c(TRUE, TRUE, FALSE, FALSE, TRUE), 
  Choice2 = c(FALSE, 
  TRUE, FALSE, TRUE, TRUE)), class = "data.frame", row.names = 
  c(NA, -5L))

推荐阅读