如何检查行值是否与相应的列值匹配

时间:2017-08-29 14:36:44

标签: r duplicates columnname

我有一个数据框,它是通过导入多个.csv文件并随后将它们合并在一起而创建的。

我读到的每个数据框都有第8行的列标题,前七行有一些描述性文字。

这就是出现重复行的原因 - 因为我无法使用第一个数据帧中第8行的值,然后丢弃其余数据帧中的前8行(或者我可以 - 我确定这是可能的。)

最终,我想要发生的是:

- Read first .csv into data frame.
- Take values of row 8 to be column names
- Delete the first 8 rows.
- Read all other .csv files in, remove the first 8 rows from each one, and merge them all into the same data frame.

我现在遇到一个问题,其中一些行将包含与其对应列名相同的值。

例如,合并的数据框现在看起来像这样:

--------------------------
| Name | Age | MonthBorn |
-------------------------
| Bob  | 23  | September |
| Steve| 45  | June      |
| Name | Age | MonthBorn | # Should be removed
| Sue  | 74  | January   |
| Name | Age | MonthBorn | # Should be removed
| Tracy| 31  | February  |
--------------------------

问题是组合数据框架的深度差不多是340,000行,因此我无法手动完成并手动检查所有内容。此外,我粗略地了解每行可能出现的情况,但我无法确定是否存在变异的可能性。

如何检查行/单元格的值是否与相应的列名匹配,或者如上所述(项目符号)设置导入过程?

3 个答案:

答案 0 :(得分:1)

您的数据

df <- structure(list(Name_ = c("Bob", "Steve", "Bob", "Name", "Sue", 
"Name", "Tracy"), `_Age_` = c("23", "45", "23", "Age", "74", 
"Age", "31"), `_MonthBorn` = c("September", "June", "September", 
"MonthBorn", "January", "MonthBorn", "February")), .Names = c("Name_", 
"_Age_", "_MonthBorn"), row.names = c(NA, -7L), class = c("data.table", 
"data.frame"))

溶液

library(stringr)
df[!sapply(1:nrow(df), function(x) all(mapply(function(x,y) str_detect(x,y), colnames(df), df[x,]))),]

输出

   Name_ _Age_ _MonthBorn
1:   Bob    23  September
2: Steve    45       June
3:   Bob    23  September
4:   Sue    74    January
5: Tracy    31   February

答案 1 :(得分:1)

我们可以使用dplyrtidyr中的函数将所有列的内容组合在一起。之后,过滤掉与组合列名称相同的那些。 dt2是最终输出。

# Create example data
dt <- read.table(text = "Name Age MonthBorn
Bob 23 September
Steve 45 June 
Bob 23 September
Name Age MonthBorn
Sue 74 January
Name Age MonthBorn
Tracy 31 February",
                 header = TRUE, stringsAsFactors = FALSE)

# Load package
library(dplyr)
library(tidyr)

# Process the data
dt2 <- dt %>%
  unite(ColName, everything(), sep = ", ", remove = FALSE) %>%
  filter(ColName != toString(colnames(dt))) %>%
  select(-ColName)

dt2
   Name Age MonthBorn
1   Bob  23 September
2 Steve  45      June
3   Bob  23 September
4   Sue  74   January
5 Tracy  31  February

答案 2 :(得分:0)

如果您的数据框大致如下所示:

{}

然后你可以使用ifelse语句测试&#34; MonthBorn&#34;连续出现。

Df <- Data.frame(Name, Age, MonthBorn)

然后你应该能够删除包含True的行,有效地删除你不想要的行。

Df$MonthBornTest <- ifelse(Df$MonthBorn == “MonthBorn”, “True”, “False”}