使用 for 和 if 添加基于数据框中其他列的列值
Posted
技术标签:
【中文标题】使用 for 和 if 添加基于数据框中其他列的列值【英文标题】:add column values based on other columns in data frame using for and if 【发布时间】:2012-12-21 12:57:29 【问题描述】:我有一个这样的数据框:
id adit diag1 diag2
2 3 4230 2234
3 5 3345 4456
4 6 4567 4467
我想使用下面的伪代码添加其他 2 列,dse1
和 dse2
:
if diag1 contains 4230 then dse1 = 1 else dse1 = 0
if diag2 contains 4567 then dse2 =1 else dse2 = 0
我用过这个:
for (i in 1 : nrow(dse))
for (j in 3: ncol(dse))
if dse[i,j] %in% ("4320")dse$dse1 = 1
elsedse$dse1 = 0
if dse[i,j] %in% ("4567")dse$dse2 = 1
elsedse$dse2 = 0
但这些都不起作用。
【问题讨论】:
以下所有答案都是正确的路线。但是,如果您使用的是if/else
,那么您的if
语句中的else needs to be on the same line as the closing
`。
for (i in 1 : nrow(dse)) for (j in 3: ncol(dse)) if ( dse[i,j] == 4230) dse$dse1 = 1 else dse$dse1 = 0 if (dse[i,j] %in% (4567)) dse$dse2 = 1 elsedse$dse2 = 0 我改代码如上,有没有错误,但结果不正确。为什么? THnaks
不知道该怎么评价你的评论。您可以根据需要编辑您的问题。此外,如果以下任何答案已解决问题,请通过单击问题旁边的绿色复选标记将其标记为已回答,以便我们都知道问题已解决。
我知道问题所在,dse$dse1 应该是 dse$dse[i],dse$dse2 应该是 dse$dse2[i]。感谢您的帮助和回答
【参考方案1】:
不用循环,比如ifelse
就行了
dse = within(dse,
dse1 = ifelse(diag1 == 4230, 1, 0)
dse2 = ifelse(diag2 == 4567, 1, 0)
)
【讨论】:
谢谢。 dse1 可能有很多诊断,即如果 dse[i,j] %in% ("2345","3456","5678") dse1 =1 )。 if 代码有什么问题吗?如何纠正它们 我不确定您想要什么,请在您的问题中添加更多信息。 @user1582755 - 要调整多个匹配项的代码,我认为您只需替换上面的相应行,例如:dse1 = ifelse(diag1 %in% c(2345,3456,5678), 1, 0)
dse1 = 1 if diag1 or diag2, etc in('224','334',333' etc) ; dse2 = 1 如果 diag1 或 diag2 或 diag3(如果有) in('444','435',etc)【参考方案2】:
不要使用 if/else。去向量化如下:
dat$dse1 <- as.numeric(dat$diag1 == 4230)
dat$dse2 <- as.numeric(dat$diag2 == 4567)
【讨论】:
+1 不错的答案,但如果觉得使用ifelse
更透明一点。此外,除了0
和1
,您还可以使用其他值。
这绝对是最好的答案。永远不要使用ifelse(cond, 1, 0)
。【参考方案3】:
像这样:
dse$dse1<-0
dse$dse2<-0
dse$dse1[dse$diag1==4230]<-1
dse$dse2[dse$diag2==4567]<-1
请为自己准备一个好的 R 教程(例如 this)并阅读所有关于索引向量的内容。
【讨论】:
感谢所有回答。如果我们改变这样的语句 if diag1 OR diag2 contains 4230 then dse1 = 1 else dse1 = 0 if diag2 or diag1 contains 4567 then dse2 =1 else dse2 = 0 and there are many diags in which there are many codes,所以有许多dses。什么是简洁的答案【参考方案4】:你可以使用transform
:
transform(dse, dse1 = as.numeric(diag1 == 4230),
dse2 = as.numeric(diag2 == 4567))
【讨论】:
谢谢。 dse1 可能有很多诊断,即如果 dse[i,j] %in% ("2345","3456","5678") dse1 =1 )。【参考方案5】:你也可以使用:
ifelse():
dat <- data.frame(id = c(2,3,4), adit = c(3,5,6),diag1 = c(4230,3345,4567), diag2 = c(2234,4567,4467))
dat$dse1 <- ifelse(dat$diag1 == 4230,1,0)
dat$dse2 <- ifelse(dat$diag2 == 4567,1,0)
dat
【讨论】:
【参考方案6】:使用tidyverse
的解决方案:
x = data.frame(id = c(2, 3, 4),
adit=c(3, 5, 6),
diag1=c(4230, 3345, 4567),
diag2=c(2234, 4456, 4467))
x %>% mutate(dse1 = if_else(diag1 == 4230, 1, 0),
dse2 = if_else(diag2 == 4567, 1, 0))
【讨论】:
以上是关于使用 for 和 if 添加基于数据框中其他列的列值的主要内容,如果未能解决你的问题,请参考以下文章