【问题标题】:R - replace values by row given some statement in if loop with another value in same dfR - 用相同df中的另一个值替换if循环中的某些语句的行值
【发布时间】:2017-09-05 14:21:54
【问题描述】:

我有一个数据集,我想用它进行多层次分析。因此,我为每个患者设置了两行,以及一对带有 1 和 2 的列(1 = 患者,2 = 患者的伴侣)。

现在,我在不同列中的患者和合作伙伴的出生日期和年龄变量现在位于同一行。 我想做的是编写一个代码:

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

每一行都是这样。由于我有多个要替换的变量,如果我能在一个循环中得到它并且只是“添加”我想要替换的变量,那就太好了。

到目前为止我尝试了什么:

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

当然这是行不通的——只是简单地说这就是我想要的。

我从这段代码开始,遵循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"
)

【问题讨论】:

  • 试试 mydf_long$pgebdat

标签: r replace


【解决方案1】:

如果您只想根据条件更改值,则以下 for 循环应该可以工作:

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

正如@lmo 所建议的,跟随会更快。

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

【讨论】:

  • 看来mydata$pgebdat[mydata$couple == 2] &lt;- mydata$prgebdat[mydata$couple == 2] 会产生相同的结果并且速度更快。如果很长,你可以分成两行 repVec &lt;- mydata$couple == 2 然后在上面的行中使用 repVec。
  • @lmo - 同意。我在上面添加了您的解决方案。
  • 谢谢!这是工作。我想更改一定数量的相邻列,这不起作用: mydf_long[125:178][i]
  • @HannekeLettinga - 据我所知,如果您指定一系列列,则不必在带有迭代器 ifor 循环中调用它。只要给定范围内的列数正确,一个简单的mydf_long[,125:178] &lt;- mydf_long[,418:471] 就可以做到。
  • @Sagar,是的,但是它替换了完整的列范围 - 但我只想 R 替换合作伙伴的列范围......所以当 Couple == 2 时,替换第 125 行: 178 表示 418:471 上该行中的值...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2012-10-12
相关资源
最近更新 更多