我有一个数据框,它是通过导入多个.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行,因此我无法手动完成并手动检查所有内容。此外,我粗略地了解每行可能出现的情况,但我无法确定是否存在变异的可能性。
如何检查行/单元格的值是否与相应的列名匹配,或者如上所述(项目符号)设置导入过程?
答案 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)
我们可以使用dplyr
和tidyr
中的函数将所有列的内容组合在一起。之后,过滤掉与组合列名称相同的那些。 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”}