使用 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 列,dse1dse2

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 更透明一点。此外,除了01,您还可以使用其他值。 这绝对是最好的答案。永远不要使用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 添加基于数据框中其他列的列值的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中的数据框中的列的每个唯一值之后添加一个空白行

遍历熊猫数据框中的列

熊猫数据框中的列的总和

Spark基于其他数据框中的列对数据框中的列进行重复数据删除

基于带有图标的列的 DataTables 搜索 [关闭]

PySpark:基于数据框中具有 UUID 的列添加新列