来自单列中多个变量的数据,如何修复?- R dataframe
Data from multiple variables in a single column, how to fix?- R dataframe
我得到了几百个 excel 文件,其中数据以 "stylized" 格式存储。当我将文件批量转换为 .csv 并读取相关行时,单个文件中的数据如下所示:
data.frame(x1= c("year", "2014", "site", "28",NA,NA), x2= LETTERS[1:6])
x1 x2
1 year A
2 2014 B
3 site C
4 28 D
5 <NA> E
6 <NA> F
我希望它看起来像这样:
data.frame(year= rep("2014",6), site= rep("28",6), x2= LETTERS[1:6])
year site x2
1 2014 28 A
2 2014 28 B
3 2014 28 C
4 2014 28 D
5 2014 28 E
6 2014 28 F
如您所见,有 2 个变量名称(年份和站点)及其数据(“2014”和“28”)存储在一个列中。 (变量数据总是在变量名后面的行中。)数据框中的其他变量,在本例中为 x2,格式正确。
我可以就如何有效地将这些变量放入它们自己的列中寻求一些建议吗?在 rbind
进入 1 之前,我需要将解决方案应用于 ~100 个不同长度的数据帧。
只要跨文件格式一致(一个大if),你可以编写代码清理一个文件,把它放在一个函数中,然后使用`lapply(files, myFunction)来将所有文件作为列表读入。在您的示例中,为方便起见命名为 df:
# code to clean data
newdf <- data.frame("year"=df$x1[2], "site"=df$x1[4], "x2"=df$x2)
# wrap this in a function together with read.csv
myFunction <- function(infile) {
df <- read.csv(infile, as.is=T)
newdf <- data.frame("year"=df$x1[2], "site"=df$x1[4], "x2"=df$x2)
return(newdf)
}
然后使用lapply
fileList <-list.files(<path>)
# new df names, remove .csv or .xlsx extensions, you may need to do a bit more
dfNames <- gsub("\..*$", "", fileList)
# get a list of the data.frames
dataList <- lapply(fileList, myFunction)
在基数 R 中:
df <- data.frame(x1= c("year", "2014", "site", "28",NA,NA), x2= LETTERS[1:6], stringsAsFactors = FALSE)
创建几个索引:
year_idx <- which(df$x1 == "year")
site_idx <- which(df$x1 == "site")
获取他们的值,
year <- df$x1[year_idx +1]
site <- df$x1[site_idx +1]
使用新值创建新列:
df["year"] <- year
df["site"] <- site
重新排列:
df <- df[, c(3,4,2)]
stylized_rearranger <- function(df) {
and just do the above steps within and return
df
}
我得到了几百个 excel 文件,其中数据以 "stylized" 格式存储。当我将文件批量转换为 .csv 并读取相关行时,单个文件中的数据如下所示:
data.frame(x1= c("year", "2014", "site", "28",NA,NA), x2= LETTERS[1:6])
x1 x2
1 year A
2 2014 B
3 site C
4 28 D
5 <NA> E
6 <NA> F
我希望它看起来像这样:
data.frame(year= rep("2014",6), site= rep("28",6), x2= LETTERS[1:6])
year site x2
1 2014 28 A
2 2014 28 B
3 2014 28 C
4 2014 28 D
5 2014 28 E
6 2014 28 F
如您所见,有 2 个变量名称(年份和站点)及其数据(“2014”和“28”)存储在一个列中。 (变量数据总是在变量名后面的行中。)数据框中的其他变量,在本例中为 x2,格式正确。
我可以就如何有效地将这些变量放入它们自己的列中寻求一些建议吗?在 rbind
进入 1 之前,我需要将解决方案应用于 ~100 个不同长度的数据帧。
只要跨文件格式一致(一个大if),你可以编写代码清理一个文件,把它放在一个函数中,然后使用`lapply(files, myFunction)来将所有文件作为列表读入。在您的示例中,为方便起见命名为 df:
# code to clean data
newdf <- data.frame("year"=df$x1[2], "site"=df$x1[4], "x2"=df$x2)
# wrap this in a function together with read.csv
myFunction <- function(infile) {
df <- read.csv(infile, as.is=T)
newdf <- data.frame("year"=df$x1[2], "site"=df$x1[4], "x2"=df$x2)
return(newdf)
}
然后使用lapply
fileList <-list.files(<path>)
# new df names, remove .csv or .xlsx extensions, you may need to do a bit more
dfNames <- gsub("\..*$", "", fileList)
# get a list of the data.frames
dataList <- lapply(fileList, myFunction)
在基数 R 中:
df <- data.frame(x1= c("year", "2014", "site", "28",NA,NA), x2= LETTERS[1:6], stringsAsFactors = FALSE)
创建几个索引:
year_idx <- which(df$x1 == "year")
site_idx <- which(df$x1 == "site")
获取他们的值,
year <- df$x1[year_idx +1]
site <- df$x1[site_idx +1]
使用新值创建新列:
df["year"] <- year
df["site"] <- site
重新排列:
df <- df[, c(3,4,2)]
stylized_rearranger <- function(df) {
and just do the above steps within and return
df
}