【问题标题】:find first value and based on the result, create new variable找到第一个值并根据结果创建新变量
【发布时间】:2016-04-28 07:22:24
【问题描述】:

我有一个 184 obs 的数据框。 5 个变量:

'data.frame':   184 obs. of  5 variables:
     $ Cat     : Factor w/ 10 levels "99-001","99-002",..: 1 1 1 1 1 1 1 1 1 1 ...
     $ No      : int  1 1 1 1 1 1 1 1 1 1 ...
     $ ehs     : int  0 0 0 0 0 0 0 0 0 0 ...
     $ Onset   : int  0 0 0 0 0 0 0 9 9 9 ...
     $ STARTING: Factor w/ 149 levels "1:37PM1","1:42PM1",..: 3 4 5 63 64 65 66 67... 

数据框来自重复测量研究,这意味着每个案例都被测量了多次:

现在我想通过判断每个病例的发病情况来创建一个新的变量(provoke)。如果起始是“0”,那么新变量(provoke)将被编码为“0”,否则为“1”。
我的 R 脚本:

no1 <- seq[seq$No == 1, ]
if (no1[1,4]==0) {no1$provoke =0} else {no1$provoke =1}
no2 <- seq[seq$No == 2, ]
if (no2[1,4]==0) {no2$provoke = 0} else {no2$provoke = 1}    

对于较大的案例数,我打算写一个循环来完成任务

 for (i in 1:10) {    
 noi <- seq[seq$No == i, ]    
 if (noi[1,4]==0) {    
 noi$provoke = 0}     
 else {noi$provoke = 1}    
}

但循环似乎不起作用。你能帮我找出错误或指出我的错误吗?

【问题讨论】:

  • noi 应该是 no[i]noi[1,4] 应该是 no[i,4]。无论哪种方式,当您在控制台中键入以下内容时,您会很好地阅读获得的帮助页面:?`[`
  • 当然,您根本不应该为此使用for 循环。矢量化解决方案要快得多。
  • 在黑暗中拍摄(没有可重复的数据),但这里有一个解决方案:df$provoke &lt;- sapply(1:nrow(df), function(x) ifelse(df[x,"Onset"]==0, 0, 1)
  • seq$provoke &lt;- ave(seq$Onset, seq$No, FUN = function(x){as.numeric(x[1] != 0)}) 如果我没看错的话......

标签: r loops if-statement for-loop dataframe


【解决方案1】:

seq 是一个非常糟糕的名称,不适合为 data.frame 选择。对于这个例子,我们称之为xy

xy <- data.frame(case = rep(1:5, each = 10), oldvar = rbinom(50, size = 1, prob = 0.5))

xy.split <- split(xy, f = xy$case)

manipulateXY <- function(x) {
  if (x[1, "oldvar"] == 0) {
    x$newvar <- 0
  } else {
    x$newvar <- 1
  }
  x
}

xy.newvar <- lapply(xy.split, FUN = manipulateXY)

xy.new <- do.call("rbind", xy.newvar)
xy.new

另一种解决方法如下。此假设数据按case 排序。

# find first occurrence 
zero.or.not <- do.call("rbind", lapply(xy.split, FUN = function(x) x[1, ]))$oldvar

# count number of rows
num.rows <- unlist(lapply(xy.split, FUN = nrow))

xy.new$newvar2 <- rep(zero.or.not, times = num.rows)
xy.new

【讨论】:

  • 我试过这个脚本,它确实有效。此外,我还学习了“拆分”功能。我在函数“manipulateXY”中遇到了另一个关于大括号“}”之前的最后一个代码“x”的问题。我想我要熟悉 R 有很多东西要学。你能给我一个学习“循环”或“函数”的建议吗?希望我以后能帮助像你这样的人。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 2019-07-31
相关资源
最近更新 更多