根据其他数据框中的列值选择R数据框中的列

时间:2020-01-03 16:16:21

标签: r string dataframe

我有两个数据框,如下所示。

  #Dataframe 1
    colname value
    col1    0.45
    col2    -0.2
    col3    -0.4
    col4    0.1

#Dataframe 2
col1 col2 col3 col4
1    5    9    5
45   29   43   9
34   33   56   3
2    67   76   1

我要做的是首先选择数据框1的所有列,这些列的值均大于0.3或值小于-0.3。我想要的第二件事是从数据框2中选择与此条件匹配的所有列。因此,应将dataframe2的col1和col3列选择为新的数据框,如下所示。

col1  col3 
1     9   
45    43   
34    56   
2     76   

我考虑过的解决方案是,首先选择您在下面的代码中可以看到的相关列。

library(sqldf)
features = sqldf('select colname from dataframe1 where value > 0.3 or value < -0.3')

之后,在for循环中构建一个字符串,如下所示。并将其粘贴到sqldf查询中以从dataframe2中选择合适的列。但是我不知道如何建立这个字符串。你们知道吗,或者有其他解决方案?

  stringValue = "col1, col3, col4"
   sprintf("SELECT %s FROM dataframe2", stringValue)

3 个答案:

答案 0 :(得分:2)

只有当前的dataframe1被选中的col1col3

library(sqldf)
features = sqldf('select colname from dataframe1 where value > 0.3 or value < -0.3')
sqldf(sprintf("SELECT %s FROM dataframe2", paste0(features$colname, collapse = ", ")))


#       col1 col3
#    1    1    9
#    2   45   43
#    3   34   56
#    4    2   76

数据

#Dataframe 1
dataframe1 <- read.table(text = 'colname value
    col1    0.45
                         col2    -0.2
                         col3    -0.4
                         col4    0.1', header = T, sep = "")

#Dataframe 2
dataframe2 <- read.table(text = 'col1 col2 col3 col4
1    5    9    5
45   29   43   9
34   33   56   3
2    67   76   1', header = T, sep = "")

答案 1 :(得分:1)

一种基本的R方法:

> mask <- dataframe1$value > 0.3 | dataframe1$value < -0.3
> dataframe2[, mask]

  col1 col3
1    1    9
2   45   43
3   34   56
4    2   76

答案 2 :(得分:0)

使用dplyr(不确定是否相关),您可以执行以下操作:

df2 %>% 
select(one_of(df1 %>% filter(value > 0.3 | value < -0.3) %>% pull(colname) %>% as.character()))

这可以通过选择与one_of中的df1中的字符串匹配filter的列名来实现。