我在dataframe
跟踪膳食和饱腹感。我希望R
在吃饱饭时在饱腹感色谱柱中将前一个值加1,在没有吃过饭时减去1(用餐= NA)。
我正在尝试使用嵌套在for loop
语句中的ifelse
来完成此操作,但它无效。
我目前的尝试:
ifelse(Meals=="NA",for (i in 1:length(Day$Fullness)){
print(Day$Fullness[[i]]-1+i)}, for (i in 1:length(Day$Fullness)){
print(Day$Fullness[[i]]+1+i)}
Error: Error in ans[test & ok] <- rep(yes, length.out = length(ans))
[test & ok] :
replacement has length zero
In addition: Warning message:
In rep(yes, length.out = length(ans)) :
'x' is NULL so the result will be NULL
我不知道如何在这里创建一个表格,但我会尽力让自己有意义。
时间:上午9:30,上午10:00,上午10:30,等等 用餐:NA NA早餐NA NA Snack NA NA NA ETC 饱腹感:范围从0-10。
我目前的饱腹感数据只是我创建的一个矢量,但我希望它从0开始并在每餐后增加1,而在每30分钟没有进餐的时间范围内减少1(其中餐= NA) )。
我确信有更好的方法可以做到这一点。
谢谢。
答案 0 :(得分:1)
这里有一些示例数据和一个潜在的解决方案。
set.seed(123)
meals <- sample(c(1, 1, 1, NA), 20, replace = TRUE)
df <- data.frame(meals = meals)
head(df)
# meals
# 1 1
# 2 NA
# 3 1
# 4 NA
# 5 NA
# 6 1
df$meals[is.na(df$meals)] <- -1
df$satiety <- cumsum(df$meals)
head(df)
# meals satiety
# 1 1 1
# 2 -1 0
# 3 1 1
# 4 -1 0
# 5 -1 -1
# 6 1 0
tail(df)
# meals satiety
# 15 1 5
# 16 -1 4
# 17 1 5
# 18 1 6
# 19 1 7
# 20 -1 6
我建议不要将没有吃饭(或跳过的餐)编码为NA
,这意味着&#34;我不知道&#34;。如果您正在使用NA
表示已经跳过了这顿饭,那么您实际上应该知道这一点,并且您应该给它一些代表跳过餐的东西。在这里,由于您的模型将跳过的膳食解释为对饱腹感产生负面影响(不是中性影响),-1
实际上非常有意义。如果您在模型中使用它,那么就这样编码。
答案 1 :(得分:0)
这里有几件事。
除非数据包含字符串&#34; NA&#34;,否则您应使用命令is.na(x)
检查一个或多个值是否为NA。如果没有样本数据,很难说清楚。
一般来说,在R中你会想要使用矢量化解决方案。在许多情况下,如果您使用for
循环,则说明不正确。
您已经说过&#34;用餐&#34;在数据框中。因此,您需要将Meals称为该数据框的子集。例如,如果数据框为data
,则表达式应为data$Meals
。
总结所有这些,我可能会做类似以下的事情:
Day$Meals.na <- is.na(Day$Meals)
print(Day$Fullness + (-1)^Day$Meals.na)
这使用了一个很好的技巧:TRUE
和FALSE
分别存储为1
和0
。
希望这会有所帮助。如果没有,我们真的需要样本数据和预期的输出才能更有用。