Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过R中的样本ID创建样本类型值差异的数据框?_R_For Loop_Dplyr_Conditional Statements - Fatal编程技术网

如何通过R中的样本ID创建样本类型值差异的数据框?

如何通过R中的样本ID创建样本类型值差异的数据框?,r,for-loop,dplyr,conditional-statements,R,For Loop,Dplyr,Conditional Statements,我想为每个样本ID创建两种样本之间的值差异的数据框。问题是一些样本ID没有两种样本类型。我想我正在寻找一个for循环/条件语句,但我还没有成功地创建一个 我在下面创建了一些示例数据: ID <- c(1,3,3,4,6,6,7,7,8,8) Type <- c('soil', 'soil', 'water','soil','soil', 'water','soil', 'water','soil', 'water') data1 <- as.data.frame(cbind(I

我想为每个样本ID创建两种样本之间的值差异的数据框。问题是一些样本ID没有两种样本类型。我想我正在寻找一个for循环/条件语句,但我还没有成功地创建一个

我在下面创建了一些示例数据:

ID <- c(1,3,3,4,6,6,7,7,8,8)
Type <- c('soil', 'soil', 'water','soil','soil', 'water','soil', 'water','soil', 'water')
data1 <- as.data.frame(cbind(ID, Type))
data1$value <- runif(length(data1$ID), min=0, max=1)
head(data1)

ID您可以在
dplyr
中使用
if
/
else
尝试条件检查:

library(dplyr)

data1 %>%
  group_by(ID) %>%
  summarise(diff = if(n_distinct(Type) == 1) NA else 
                      value[Type == 'water'] - value[Type == 'soil'])
如果
类型中有1个唯一值,则返回
NA
,否则返回两者之间的差异


不使用
if
/
else
的一个技巧是将差异子集,这样当没有值时,它会自动返回
NA

data1 %>%
  group_by(ID) %>%
  summarise(diff = (value[Type == 'water'] - value[Type == 'soil'])[1])

这正是我需要的!非常感谢。