如果(条件),则将1添加到上一个值,否则减去1

时间:2018-06-14 23:36:44

标签: r if-statement

我在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) )。

我确信有更好的方法可以做到这一点。

谢谢。

2 个答案:

答案 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)

这里有几件事。

  1. 除非数据包含字符串&#34; NA&#34;,否则您应使用命令is.na(x)检查一个或多个值是否为NA。如果没有样本数据,很难说清楚。

  2. 一般来说,在R中你会想要使用矢量化解决方案。在许多情况下,如果您使用for循环,则说明不正确。

  3. 您已经说过&#34;用餐&#34;在数据框中。因此,您需要将Meals称为该数据框的子集。例如,如果数据框为data,则表达式应为data$Meals

  4. 总结所有这些,我可能会做类似以下的事情:

    Day$Meals.na <- is.na(Day$Meals)
    print(Day$Fullness + (-1)^Day$Meals.na)
    

    这使用了一个很好的技巧:TRUEFALSE分别存储为10

    希望这会有所帮助。如果没有,我们真的需要样本数据和预期的输出才能更有用。