我有两个数据框,如下所示。
#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)
答案 0 :(得分:2)
只有当前的dataframe1
被选中的col1
和col3
。
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
的列名来实现。