R语言中嵌套ifelse和if语句的语法

4

我想在R语言中嵌套使用if和ifelse语句,但是我无法正确使用语法。我想执行一些基本算术操作:如果日期相同且地点代码相同,则希望从代码F的对应pH值中减去代码A和B的pH值,并将结果输入到pHDelta中。或者换句话说,对于给定的日期和位置,计算A-F的值。

谢谢!

如果下面创建的数据集未能正确显示,请见谅。

我的数据集类似于以下示例:

日期 地点 代码 pH值 pH变化量
22/07/01 AA A 7.1
22/07/01 AA B 6.8
22/07/01 AA F 8.2
22/07/01 AB A 7. 2
22/07/01 AB B 7.8
22/07/01 AB F 8.4
22/07/01 AC A 7.5
22/07/01 AC B 6.2
22/07/01 AC F 8.3
22/07/01 AD A 7.1
22/07/01 AD B 6.8
22/07/01 AD F 8.2
22/07/02 AA A 7.1
2个回答

4
我们可以采用分组的方法,按照“日期”、“地点”对数据进行分组,然后选取“Code”值为“F”的“pH”子集(假设每个地点只有一个“F”),再从“pH”列中减去该子集。
library(dplyr)
df1 <- df1 %>%
     group_by(Date, Location) %>%
     mutate(phDelta = pH - pH[Code == "F"][1]) %>%
     ungroup

哇。我甚至不需要if语句。R太疯狂了。 每个地点,每个日期只有一个“F”位置。它会在每个日期重复出现。让我们看看我能不能让它工作。 - Paul Wild
1
@PaulWild 我之所以指定一个“F”,是因为对于单个元素,它会被循环使用。而对于多个元素,会出现长度问题(因为它是逐元素进行的)。 - akrun
1
如果同一位置存在多个日期,请在group by中添加日期,例如TarJae的解决方案中使用的group_by(Date, Location) - akrun
即使在group_by中添加日期,我仍然遇到错误:'Error in mutate(): ! Problem while computing PhDelta = pH - pH[Chamber == "FL"]. x PhDelta must be size 1, not 0. i The error occurred in group 132: DATE = NA, LOC = "".' - Paul Wild
1
@PaulWild 这是一种情况,当你没有“FL”值时... 你可以使用 pH[Chamber == 'FL'][1] 强制转换为 NA。以你的例子为例,如果我将最后一个元素更改为 C 或其他值,它仍然可以工作。 - akrun
1
啊,谢谢。我感觉自己对 R 有足够的了解,可以让自己陷入麻烦。 - Paul Wild

3

另一种方法:由于有重复的计算,我们也可以采用以下方式:

library(dplyr)

df %>% 
  group_by(Date, Location) %>% 
  arrange(Code, .by_group = TRUE) %>% 
  mutate(pHDelta = pH-last(pH)) %>% 
  ungroup()

  Date     Location Code     pH pHDelta
   <chr>    <chr>    <chr> <dbl>   <dbl>
 1 22/07/01 AA       A       7.1  -1.1  
 2 22/07/01 AA       B       6.8  -1.4  
 3 22/07/01 AA       F       8.2   0    
 4 22/07/01 AB       A       7.2  -1.2  
 5 22/07/01 AB       B       7.8  -0.600
 6 22/07/01 AB       F       8.4   0    
 7 22/07/01 AC       A       7.5  -0.800
 8 22/07/01 AC       B       6.2  -2.1  
 9 22/07/01 AC       F       8.3   0    
10 22/07/01 AD       A       7.1  -1.1  
# ... with 14 more rows

数据:

structure(list(Date = c("22/07/01", "22/07/01", "22/07/01", "22/07/01", 
"22/07/01", "22/07/01", "22/07/01", "22/07/01", "22/07/01", "22/07/01", 
"22/07/01", "22/07/01", "22/07/02", "22/07/02", "22/07/02", "22/07/02", 
"22/07/02", "22/07/02", "22/07/02", "22/07/02", "22/07/02", "22/07/02", 
"22/07/02", "22/07/02"), Location = c("AA", "AA", "AA", "AB", 
"AB", "AB", "AC", "AC", "AC", "AD", "AD", "AD", "AA", "AA", "AA", 
"AB", "AB", "AB", "AC", "AC", "AC", "AD", "AD", "AD"), Code = c("A", 
"B", "F", "A", "B", "F", "A", "B", "F", "A", "B", "F", "A", "B", 
"F", "A", "B", "F", "A", "B", "F", "A", "B", "F"), pH = c(7.1, 
6.8, 8.2, 7.2, 7.8, 8.4, 7.5, 6.2, 8.3, 7.1, 6.8, 8.2, 7.1, 6.8, 
8.2, 7.2, 7.8, 8.4, 7.5, 6.2, 8.3, 7.1, 6.8, 8.2)), class = "data.frame", row.names = c(NA, 
-24L))

这个可以工作了。最初它在控制台中输出了一个表格。我需要将其分配给原始表格,以便pHDelta值得到更新。谢谢。只是再次确认它没有影响到其他数据。 - Paul Wild
1
df 再次赋值为 df <- df %>% ... - TarJae

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接