Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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 如何根据特定的变量值清理df?_R_Dataframe_Extract_Sanitize - Fatal编程技术网

R 如何根据特定的变量值清理df?

R 如何根据特定的变量值清理df?,r,dataframe,extract,sanitize,R,Dataframe,Extract,Sanitize,我有两个数据帧dfOne是这样制作的: X Y Z T J 3 4 5 6 1 1 2 3 4 1 5 1 2 5 1 而dfTwo是这样制作的 C.1 C.2 X Z Y T 我想获得一个新的数据帧,其中同时存在小于特定阈值的X、Y、Z、T值 例如。我需要同时(在同一行中): X,Y>2 Z,T>4 我需要使用第二个数据帧来实现我的目标,我希望如下: dfTwo$C.1>2 因此,结果将是具有此结构的新数据帧: X Y Z T J 3 4 5

我有两个数据帧
dfOne
是这样制作的:

 X Y Z T J
 3 4 5 6 1
 1 2 3 4 1
 5 1 2 5 1
dfTwo
是这样制作的

 C.1  C.2
  X    Z
  Y    T
我想获得一个新的数据帧,其中同时存在小于特定阈值的
X
Y
Z
T

例如。我需要同时(在同一行中):

  • X,Y>2
  • Z,T>4
我需要使用第二个数据帧来实现我的目标,我希望如下:

dfTwo$C.1>2
因此,结果将是具有此结构的新数据帧:

 X Y Z T J
 3 4 5 6 1
我怎么做呢

dfOne[Reduce(intersect, list(which(dfOne["X"] > 2),
                             which(dfOne["Y"] > 2),
                             which(dfOne["Z"] > 4),
                             which(dfOne["T"] > 4))),]
#  X Y Z T J
#1 3 4 5 6 1
或迭代(因此测试的不等式更少):

或迭代(因此测试的不等式更少):


我写这篇文章的假设是,第二个DF将对第一个DF中的字段进行分类。如果不需要使用第二种方法来定义条件,则更简单:

dfNew = dfOne[dfOne$X > 2 & dfOne$Y > 2 & dfOne$Z > 4 & dfOne$T > 4, ]
或者,使用dplyr:

library(dplyr)
dfNew = dfOne %>% filter(X > 2 & Y > 2 & Z > 4 & T > 4)

如果您只需要这些,我将保留此评论,同时我将探讨问题的更复杂版本。

我在编写此评论时假设第二个DF用于对第一个DF中的字段进行分类。如果不需要使用第二种方法来定义条件,则更简单:

dfNew = dfOne[dfOne$X > 2 & dfOne$Y > 2 & dfOne$Z > 4 & dfOne$T > 4, ]
或者,使用dplyr:

library(dplyr)
dfNew = dfOne %>% filter(X > 2 & Y > 2 & Z > 4 & T > 4)

如果您只需要这些,我将在讨论更复杂的问题时保存此评论。

这里是一个基本的R方法,使用
Map
Reduce

# build lookup table of thresholds relative to variable name
vals <- setNames(c(2, 2, 4, 4), unlist(dat2))
# subset data.frame
dat[Reduce("&", Map(">", dat[names(vals)], vals)), ]
  X Y Z T J
1 3 4 5 6 1

下面是一个带有
Map
Reduce
的基本R方法

# build lookup table of thresholds relative to variable name
vals <- setNames(c(2, 2, 4, 4), unlist(dat2))
# subset data.frame
dat[Reduce("&", Map(">", dat[names(vals)], vals)), ]
  X Y Z T J
1 3 4 5 6 1

我们可以使用
purr

这是输入数据

# Data frame from lmo's solution
dat <-
  structure(list(X = c(3L, 1L, 5L), Y = c(4L, 2L, 1L), Z = c(5L, 
                                                             3L, 2L), T = c(6L, 4L, 5L), J = c(1L, 1L, 1L)), .Names = c("X", 
                                                                                                                        "Y", "Z", "T", "J"), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                 -3L))

# A numeric vector to show the threshold values
# Notice that columns without any requirements need NA   
vals <- c(X = 2, Y = 2, Z = 4, T = 4, J = NA)
为了完成任务,我加载
dplyr
tidyr

library(dplyr)
library(tidyr)
现在我开始变换
dfTwo
。第一步是使用
stack
函数转换格式

dfTwo2 <- dfTwo %>%
  stack() %>%
  setNames(c("Col", "Group")) %>%
  mutate(Group = as.character(Group))
dfTwo2
  Col Group
1   X   C.1
2   Y   C.1
3   Z   C.2
4   T   C.2
然后我们可以使用
left_join
函数来组合数据帧

dfTwo <- read.table(text = "C.1  C.2
X    Z
Y    T",
                     header = TRUE, stringsAsFactors = FALSE)

dfTwo
  C.1 C.2
1   X   Z
2   Y   T
dfTwo3 <- dfTwo2  %>% left_join(threshold_dt, by = "Group")
dfTwo3
  Col Group Value
1   X   C.1     2
2   Y   C.1     2
3   Z   C.2     4
4   T   C.2     4
第四步是正确排列
dfTwo4
。我们可以通过将
Col
转换为factor并根据
dat
中列名的顺序分配级别来实现这一点

dfTwo5 <- dfTwo4 %>%
  mutate(Col = factor(Col, levels = colnames(dat))) %>%
  arrange(Col) %>%
  mutate(Col = as.character(Col))  
dfTwo5
# A tibble: 5 x 3
    Col Group Value
  <chr> <chr> <dbl>
1     X   C.1     2
2     Y   C.1     2
3     Z   C.2     4
4     T   C.2     4
5     J  <NA>    NA
现在我们准备使用
purr
包来过滤数据

以上是步骤的分解。我们可以将所有这些步骤合并到下面的simlicity代码中

library(dplyr)
library(tidyr)
threshold_df <- data.frame(Group = c("C.1", "C.2"),
                           Value = c(2, 4),
                           stringsAsFactors = FALSE)

dfTwo2 <- dfTwo %>%
  stack() %>%
  setNames(c("Col", "Group")) %>%
  mutate(Group = as.character(Group)) %>%
  left_join(threshold_df, by = "Group") %>%
  complete(Col = colnames(dat)) %>%
  mutate(Col = factor(Col, levels = colnames(dat))) %>%
  arrange(Col) %>%
  mutate(Col = as.character(Col))

vals <- dfTwo2$Value
names(vals) <- dfTwo2$Col
库(dplyr)
图书馆(tidyr)
阈值_df%
集合名(c(“列”、“组”))%>%
变异(组=as.character(组))%>%
左联接(阈值,由=“组”)%>%
完成(Col=colnames(dat))%>%
突变(Col=因子(Col,levels=colnames(dat)))%>%
排列(列)%>%
变异(列=作为字符(列))

VAL我们可以使用
purrr

这是输入数据

# Data frame from lmo's solution
dat <-
  structure(list(X = c(3L, 1L, 5L), Y = c(4L, 2L, 1L), Z = c(5L, 
                                                             3L, 2L), T = c(6L, 4L, 5L), J = c(1L, 1L, 1L)), .Names = c("X", 
                                                                                                                        "Y", "Z", "T", "J"), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                 -3L))

# A numeric vector to show the threshold values
# Notice that columns without any requirements need NA   
vals <- c(X = 2, Y = 2, Z = 4, T = 4, J = NA)
为了完成任务,我加载
dplyr
tidyr

library(dplyr)
library(tidyr)
现在我开始变换
dfTwo
。第一步是使用
stack
函数转换格式

dfTwo2 <- dfTwo %>%
  stack() %>%
  setNames(c("Col", "Group")) %>%
  mutate(Group = as.character(Group))
dfTwo2
  Col Group
1   X   C.1
2   Y   C.1
3   Z   C.2
4   T   C.2
然后我们可以使用
left_join
函数来组合数据帧

dfTwo <- read.table(text = "C.1  C.2
X    Z
Y    T",
                     header = TRUE, stringsAsFactors = FALSE)

dfTwo
  C.1 C.2
1   X   Z
2   Y   T
dfTwo3 <- dfTwo2  %>% left_join(threshold_dt, by = "Group")
dfTwo3
  Col Group Value
1   X   C.1     2
2   Y   C.1     2
3   Z   C.2     4
4   T   C.2     4
第四步是正确排列
dfTwo4
。我们可以通过将
Col
转换为factor并根据
dat
中列名的顺序分配级别来实现这一点

dfTwo5 <- dfTwo4 %>%
  mutate(Col = factor(Col, levels = colnames(dat))) %>%
  arrange(Col) %>%
  mutate(Col = as.character(Col))  
dfTwo5
# A tibble: 5 x 3
    Col Group Value
  <chr> <chr> <dbl>
1     X   C.1     2
2     Y   C.1     2
3     Z   C.2     4
4     T   C.2     4
5     J  <NA>    NA
现在我们准备使用
purr
包来过滤数据

以上是步骤的分解。我们可以将所有这些步骤合并到下面的simlicity代码中

library(dplyr)
library(tidyr)
threshold_df <- data.frame(Group = c("C.1", "C.2"),
                           Value = c(2, 4),
                           stringsAsFactors = FALSE)

dfTwo2 <- dfTwo %>%
  stack() %>%
  setNames(c("Col", "Group")) %>%
  mutate(Group = as.character(Group)) %>%
  left_join(threshold_df, by = "Group") %>%
  complete(Col = colnames(dat)) %>%
  mutate(Col = factor(Col, levels = colnames(dat))) %>%
  arrange(Col) %>%
  mutate(Col = as.character(Col))

vals <- dfTwo2$Value
names(vals) <- dfTwo2$Col
库(dplyr)
图书馆(tidyr)
阈值_df%
集合名(c(“列”、“组”))%>%
变异(组=as.character(组))%>%
左联接(阈值,由=“组”)%>%
完成(Col=colnames(dat))%>%
突变(Col=因子(Col,levels=colnames(dat)))%>%
排列(列)%>%
变异(列=作为字符(列))

VAL第二个用于对变量进行分类,因为在实际问题中,我有140个不同的变量和14个变量簇。因此,我需要一个算法,让我为每个簇中包含的所有变量一次性定义条件(es.>2)。第二个算法用于对变量进行分类,因为在实际问题中,我有140个不同的变量和14个变量簇。所以我需要一个算法,让我为每个集群中包含的所有变量一次性定义条件(es.>2)。为每个变量分配阈值(es.X=2,Y=2,等等)对我来说是个问题。第二个数据帧旨在简化该过程步骤。事实上,在我真正的问题中,我处理了140多个变量,集中在14个不同的组中。所以我需要整合使用dfTwo的步骤来达到我的目标。我明白了。一旦我进入我的电脑,我可以告诉你如何将dfTwo转换成向量。我会随时通知你。@Silvia请查看我的更新。我提供了如何从
dfTwo
创建
vals
的详细信息。我希望这有帮助。我已经解决了所有的问题。谢谢你的帮助。它工作得很好!对我来说,给每个变量分配阈值是一个问题(es.X=2,Y=2,等等)。第二个数据帧旨在简化该过程步骤。事实上,在我真正的问题中,我处理了140多个变量,集中在14个不同的组中。所以我需要整合使用dfTwo的步骤来达到我的目标。我明白了。一旦我进入我的电脑,我可以告诉你如何将dfTwo转换成向量。我会随时通知你。@Silvia请查看我的更新。我提供了如何从
dfTwo
创建
vals
的详细信息。我希望这有帮助。我已经解决了所有的问题。谢谢你的帮助。它工作得很好!