R - 删除名称不包含在列表中的列

Posted

技术标签:

【中文标题】R - 删除名称不包含在列表中的列【英文标题】:R - Delete columns which names are not included in a list 【发布时间】:2018-06-28 03:05:55 【问题描述】:

我有 2 个这样的数据框(代码如下):

>MainFrame
   Station        V1        V2       V3
1  Station1  5.000000  4.000000 10.00000
2  Station2  8.571429  5.714286 17.14286
3  Station3 12.142857  7.428571 24.28571
4  Station4 15.714286  9.142857 31.42857
5  Station6 19.285714 10.857143 38.57143
6  Station7 22.857143 12.571429 45.71429
7  Station9 26.428571 14.285714 52.85714
8  Station10 30.000000 16.000000 60.00000

>SubFrame
    Date     Station1 Station3 Station5 Station7 Station8
1 20000608        5      4.0       10        5        5
2 20000609       10      6.4       20       10       10
3 20000610       15      8.8       30       15       15
4 20000611       20     11.2       40       20       20
5 20000612       25     13.6       50       25       25
6 20000613       30     16.0       60       30       30

我现在想检查 SubFrame 中的 Station-Names(列名)是否包含在 MainFrame 的第一列中。如果没有,我想删除子框架中的这些列。我只想让子帧中的站也列在 MainFrame 中。

在这种情况下,我想删除 SubFrame 中的 Station5 和 Station8 列,因为它们不包含在 MainFrame 中。

结果应该是这样的:

      Date    Station1 Station3 Station7
1 20000608        5      4.0        5
2 20000609       10      6.4       10
3 20000610       15      8.8       15
4 20000611       20     11.2       20
5 20000612       25     13.6       25
6 20000613       30     16.0       30

知道怎么做吗?

这是我的 2 个测试框架的代码:

x1= c("Station1", "Station2", "Station3", "Station4", "Station6", "Station7", "Station9", "Station10")
x2= seq(5, 30, length=8)
x3= seq(4, 16, length=8)
x4= seq(10, 60, length=8) 

MainFrame = data.frame(Station=x1, V1=x2, V2=x3, V3=x4) 

x1= c("20000608", "20000609", "20000610", "20000611", "20000612", "20000613") 
x2= seq(5, 30, length=6)
x3= seq(4, 16, length=6)
x4= seq(10, 60,length=6) 
x5= seq(5, 30, length=6)
x6= seq(5, 30, length=6)

SubFrame = data.frame(Date=x1, Station1=x2, Station3=x3, Station5=x4, Station7=x5, Station8 =x6) 

【问题讨论】:

【参考方案1】:

您可以通过执行以下操作指定您只需要 MainFrame 中的列,从而对您的 SubFrame 数据框进行子集化:

unique(MainFrame$Station) 产生:

unique(MainFrame$Station)
[1] "Station1"  "Station2"  "Station3"  "Station4"  "Station6"  "Station7"  "Station9"  "Station10"

*请注意,您必须将此列作为字符 col。您可以通过设置来做到这一点:

MainFrame$Station <- as.character(MainFrame$Station)

然后你可以子集:

SubFrame[,colnames(SubFrame) %in% unique(MainFrame$Station)]
  Station1 Station3 Station7
1        5      4.0        5
2       10      6.4       10
3       15      8.8       15
4       20     11.2       20
5       25     13.6       25
6       30     16.0       30

我们缺少 Date 列,因此我们可以通过使用上述内容并仅使用 Date 列使用 cbind 来获取它:

cbind(Date = SubFrame$Date, SubFrame[,colnames(SubFrame) %in% unique(MainFrame$Station)])

      Date Station1 Station3 Station7
1 20000608        5      4.0        5
2 20000609       10      6.4       10
3 20000610       15      8.8       15
4 20000611       20     11.2       20
5 20000612       25     13.6       25
6 20000613       30     16.0       30

【讨论】:

谢谢!那工作得很好!我永远也想不到!

以上是关于R - 删除名称不包含在列表中的列的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny DataTable如何防止包含超链接的列中的行选择/取消选择

如何从熊猫数据框中的列中删除字符串值

从数据框中删除不包括一组列的列中的nan行。

包含逗号分隔值的列中的值

R语言使用isna函数查看列表和dataframe中是否包含缺失值将dataframe中数据列中的异常值标注为缺失值NA使用na.omit函数删除dataframe中包含缺失值NA的数据行

包含多个世界的列中的全文搜索搜索