0

我对 R 很陌生,我正在尝试运行一个循环,因此非常感谢任何帮助。

我有每个参与者的多个时间点的纵向数据,看起来像所附的图片1

我需要用变量等于 0NA时的值替换这些值,并且我想编写一个循环来为每个参与者执行此操作。Years我编写了一些似乎可以工作的代码,但是它只为循环的最后一次迭代(最后一个参与者)提供输出。这是我正在使用的代码:

x <- c(1:4) 

n = length(x)

for(i in 1:n)
{
  data <- subset(df, ID %in% c(x[i]))
  
  data$outcome <- ifelse(is.na(data$outcome), 
                         data[1,3], 
                   data$outcome)
}

使用此代码,输出仅给出最后一次迭代(即在本例中为ID4)。我需要为所有 ID 完成此操作。

任何帮助深表感谢!谢谢你。

4

4 回答 4

0

您的循环替换data$outcome每次迭代。这就是为什么你只能得到最后一个结果。

这是我不优雅的解决方案:

制作样本数据以匹配您的(不包括未使用的列)

my_dat <- data.frame("years" = sample(c(0, 1.5, 3), 30, replace = T),
                      "outcome" = as.numeric(sample(c("", 1, 2), 30, replace = T)))

找出哪些行都是 0 年并且缺少结果

my_index <- my_dat$years == 0 * is.na(my_dat$outcome)

分配 0 来替换 NA:

my_dat$outcome[my_index] <- 0
于 2020-11-11T10:50:01.100 回答
0

一个更简单的 tidyverse 方法:

library(tidyverse)

df %>%
  filter(ID %in% x) %>%
  mutate(outcome = ifelse(is.na(Outcome), Years, Outcome))
  
于 2020-11-11T11:13:48.097 回答
0

你的问题可以做一些澄清和一个可重复的例子。据我了解:“我需要用 Years 变量等于 0 时的值替换 NA 值”。所以如果outcome等于NAYears等于0你想outcom等于0

set.seed(1984) # ser the seed so that my_dat is the same each time
# using a modified df from markhogue answer...
my_dat <- data.frame(
  ID = 1:30,
  years = sample(c(0, 1.5, 3), 30, replace = T),
  outcome = as.numeric(sample(c("", 1, 2), 30, replace = T))
)
my_dat # have a look at rows 9 and 22
# ifelse given two conditions does year == 0 and is.na(outcome)
my_dat$outcome <- ifelse(my_dat$year == 0 & is.na(my_dat$outcome), my_dat$years, my_dat$outcome)
my_dat # have a look at rows 9 and 22

让我知道这是否是您需要的:)

于 2020-11-11T19:49:48.243 回答
0

我不是 100% 清楚你的意图,但这将在一个 ID 内,用where 行中outcomes的(第一个)值填充所有缺失值。outcomesYears == 0

library(dplyr)
df %>% 
  group_by(ID) %>%
  mutate(outcome = coalesce(outcome, first(outcomes[Years == 0])))

显然未经测试,但如果您提供一些示例数据,我会很乐意帮助调试。

于 2020-11-11T19:59:01.010 回答