【问题标题】:Selecting columns in R dataframe based on values of column in other dataframe根据其他数据框中的列值选择 R 数据框中的列
【发布时间】:2020-01-03 16:16:21
【问题描述】:

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

  #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 或值

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)

【问题讨论】:

  • paste(features, collapse=",") 应该可以工作

标签: r string dataframe


【解决方案1】:

对于您当前的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 = "")

【讨论】:

  • 最后一行sqldf可以写成fn$sqldf("SELECT `toString(features$colname)` FROM dataframe2")cols &lt;- toString(features$colname); fn$sqldf("SELECT $cols FROM dataframe2")
  • 第一个sqldf语句也可以写成features &lt;- sqldf('select colname from dataframe1 where not value between -0.3 and 0.3')
【解决方案2】:

执行此操作的基本 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

【讨论】:

    【解决方案3】:

    使用dplyr(不确定是否相关),您可以这样做:

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

    这通过选择与one_of 匹配的列名来工作,来自df1 的字符串在filter 中工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多