我的数据框(file_df)如下所示:
Filename
A_2005.txt
A_2006.txt
B_2007.txt
我想这样做:
Filename Station_Year Station Year
A_2005.txt A_2005 A 2005
A_2006.txt A_2006 A 2006
B_2007.txt B_2007 B 2007
我试过了:
file_df$Station_Year <- strsplit(file_df$Filename,"[.]")[[1]][1]
file_df$Station <- strsplit(file_df$Filename,"[._]")[[1]][1]
file_df$Year <- strsplit(file_df$Filename,"[._]")[[1]][2]
但我明白了:
Filename Station_Year Station Year
A_2005.txt A_2005 A 2005
A_2006.txt A_2005 A 2005
B_2007.txt A_2005 A 2005
怎么了?
答案 0 :(得分:2)
以下是两种方法:
1)sub
# test data
DF <- data.frame(Filename = c("A_2005.txt", "A_2006.txt", "B_2007.txt"))
transform(DF, Station_Year = sub("\\..*", "", Filename),
Station = sub("_.*", "", Filename),
Year = as.numeric(sub(".*_(.*)\\..*", "\\1", Filename)))
,并提供:
Filename Station_Year Station Year
1 A_2005.txt A_2005 A 2005
2 A_2006.txt A_2006 A 2006
3 B_2007.txt B_2007 B 2007
2)strsplit
s <- do.call("rbind", strsplit(as.character(DF$Filename), "[_.]"))
cbind(DF, data.frame(Station_Year = paste(s[, 1], s[, 2], sep = "_"),
Station = s[, 1],
Year = as.numeric(s[, 2])))
ADDED 第二个解决方案。小改进。
答案 1 :(得分:0)
如果所有文件名长度相同,则可以使用substr:
file_df$Station_Year <- substr(file_df$Filename, 1,6)
file_df$STATION <- substr(file_df$Filename, 1,1)
file_df$YEAR <- substr(file_df$Filename, 3,6)
但只有文件名的长度始终相同时才会有效。
答案 2 :(得分:0)
这不会得到你想要的结果。 @ g-grothendieck的帖子是你想要的。
您使用方法时遇到的问题是strsplit()
会返回一个列表,其中每个元素都代表file_df$Filename
的覆盖元素的结果。
strsplit(file_df$Filename,"[.]")
#[[1]]
#[1] "A_2005" "txt"
#[[2]]
#[1] "A_2006" "txt"
#[[3]]
#[1] "B_2007" "txt"
在您的代码中,您只需选择结果列表的第一个元素([[1]]
),这会导致您的结果从第一个文件名中重复所需的值。