2017-09-05 108 views
0

我有一個數據集,我想要進行多級分析。因此,對於每位患者,我有兩行,並且有一列1和2(1 =患者,2 =患者的伴侶)。R - 按給定的語句在if循環中用同一個df中的另一個值替換行的值

現在,我有變量與出生日期和年齡,病人和合作夥伴在不同的列現在在同一行。 我想要做的就是寫,做了代碼:

if mydata$couple == 2, then replace mydata$dateofbirthpatient with mydata$dateofbirthpatient 

而且,對於每一行。由於我有多個要替換的變量,如果我可以在循環中獲得這個變量並且只是「添加」我想替換的變量,那將是可愛的。

我試了一下,到目前爲止:

mydf_longer <- if (mydf_long$couple == 2) { 
    mydf_long$pgebdat <- mydf_long$prgebdat 
} 

Ofcourse這是行不通的 - 但是簡單地說,這是我想要的。

我開始使用此代碼,按照By row, replace values equal to value in specified column 的例子,但不知道如何完成:

mydf_longer[6:7][mydf_longer[,1:4]==mydf_longer[2,2]] <- 

任何想法?如果您需要更多信息,請與我們聯繫。數據

例子:

#  id couple groep_MNC zkhs fbeh pgebdat p_age pgesl prgebdat pr_age 
# 1 3  1   1 1 1 1955-12-01 42.50000  1  <NA>  NA 
# 1.1 3  2   1 1 1 1955-12-01 42.50000  1  <NA>  NA 
# 2 5  1   1 1 1 1943-04-09 55.16667  1 1962-04-18 36.5 
# 2.1 5  2   1 1 1 1943-04-09 55.16667  1 1962-04-18 36.5 
# 3 7  1   1 1 1 1958-04-10 40.25000  1  <NA>  NA 
# 3.1 7  2   1 1 1 1958-04-10 40.25000  1  <NA>  NA 

mydf_long <- structure(
    list(id = c(3L, 3L, 5L, 5L, 7L, 7L), 
     couple = c(1L, 2L, 1L, 2L, 1L, 2L), 
     groep_MNC = c(1L, 1L, 1L, 1L, 1L, 1L), 
     zkhs = c(1L, 1L, 1L, 1L, 1L, 1L), 
     fbeh = c(1L, 1L, 1L, 1L, 1L, 1L), 
     pgebdat = structure(c(-5145, -5145, -9764, -9764, -4284, -4284), class = "Date"), 
     p_age = c(42.5, 42.5, 55.16667, 55.16667, 40.25, 40.25), 
     pgesl = c(1L, 1L, 1L, 1L, 1L, 1L), 
     prgebdat = structure(c(NA, NA, -2815, -2815, NA, NA), class = "Date"), 
     pr_age = c(NA, NA, 36.5, 36.5, NA, NA)), 
    .Names = c("id", "couple", "groep_MNC", "zkhs", "fbeh", "pgebdat", 
      "p_age", "pgesl", "prgebdat", "pr_age"), 
    row.names = c("1", "1.1", "2", "2.1", "3", "3.1"), 
    class = "data.frame" 
) 
+0

嘗試mydf_long $ pgebdat < - ifelse(mydf_long $夫婦== 2,mydf_long $ prgebdat,mydf_long $ pgebdat) – user108363

回答

1

以下for循環應該工作,如果你只需要根據條件來改變值:

for(i in 1:nrow(mydata)){ 
    if(mydata$couple[i] == 2){ 
    mydata$pgebdat[i] <- mydata$prgebdat[i] 
    } 
} 

OR

正如所建議的@ lmo,下面的工作會更快。

mydata$pgebdat[mydata$couple == 2] <- mydata$prgebdat[mydata$couple == 2] 
+1

似乎'$ MYDATA pgebdat [MYDATA $夫婦== 2] < - MYDATA $ prgebdat [ mydata $ couple == 2]'會產生相同的結果,速度會更快。如果時間很長,你可以分成2行'repVec < - mydata $ couple == 2',然後在上面一行使用repVec。 – lmo

+1

@lmo - 同意。我在上面添加了解決方案。 – Sagar

+0

謝謝!這是工作。我想改變一定數量的相鄰列,這是行不通的:mydf_long [125:178] [i] < - mydf_long [418:471] [i] - 我可能索引錯誤。我也試過這個:mydf_long [,125:178] [i] < - mydf_long [,418:471] [i]但它不起作用。任何人都知道如何正確索引? – HannekeLettinga

相關問題