R 如何在lapply内的函数中引用df的另一列?

R 如何在lapply内的函数中引用df的另一列?,r,apply,lapply,R,Apply,Lapply,样本df: dat <- data.frame(position = c("A", "B", "B", "A", "B", "A"), choice = c("A", "A", "B", "B", "A", "B")) position choice 1 A A 2 B A 3 B B 4 A

样本df:

dat <- data.frame(position = c("A", "B", "B", "A", "B", "A"),
                  choice = c("A", "A", "B", "B", "A", "B"))

   position   choice   
1         A        A      
2         B        A      
3         B        B
4         A        B
5         B        A
6         A        B
到目前为止,我尝试使用相同的“choice”值创建一个新列,然后使用Lappy或sapply将这些值替换为如下条件:

dat$value <- dat$choice

dat$choice[] <- lapply(dat$choice, function(x) 
                       ifelse(x == dat$position, "ok", x))

dat$value如果需要字符串
“no”
“ok”
而不是逻辑值
FALSE
TRUE
,那么除了使用带有适当因子标签的
ifelse()
之外,还有一个不错的选择:

dat$value <- factor(dat$position == dat$choice, labels = c("no", "ok"))
dat
警告 示例数据集
dat
是使用
data.frame
创建的,默认情况下,它强制字符变量为factor

到目前为止发布的所有建议都假设系数列
position
choice
的水平集是相同的。不幸的是,如果列中有不同的字母集,所有解决方案都将失败(无论出于什么原因):

因此,需要相应地修改解决方案

dat$value <- factor(as.character(dat$position) == as.character(dat$choice), 
                    labels = c("no", "ok"))
dat
还需要修改
ifelse()
方法:

dat$value <- ifelse(as.character(dat$position) == as.character(dat$choice), 
                    "ok", "no")

dat$value您不需要使用
lappy
或循环<代码>=
已矢量化。只需在旁注上添加
dat$值,您获得所描述结果的原因是
ifelse
是矢量化的。这意味着
lappy
dat$choice
的每个值上循环,然后在每个值上在
dat$position
的所有值上循环。如果你想使用
ifelse
那么你只需要做
dat$value谢谢你们,我真不敢相信这么简单,我在上面浪费了这么多时间!我真的需要完成我的R基础,一旦我完成了这一点,可以继续前进。为这个愚蠢的问题感到抱歉,再次感谢!
  position choice value
1        A      A    ok
2        B      A    no
3        B      B    ok
4        A      B    no
5        B      A    no
6        A      B    no
dat <- data.frame(position = c("A", "B", "B", "A", "B", "D"),
                  choice = c("A", "A", "B", "B", "A", "C"))
dat$choice == dat$position
as.character(dat$position) == as.character(dat$choice)
[1]  TRUE FALSE  TRUE FALSE FALSE FALSE
dat$value <- factor(as.character(dat$position) == as.character(dat$choice), 
                    labels = c("no", "ok"))
dat
  position choice value
1        A      A    ok
2        B      A    no
3        B      B    ok
4        A      B    no
5        B      A    no
6        D      C    no
dat$value <- ifelse(as.character(dat$position) == as.character(dat$choice), 
                    "ok", "no")