R 如何在lapply内的函数中引用df的另一列?
样本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
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")