对数据框中字符的操作

时间:2014-02-28 13:34:43

标签: r dataframe

我的数据框(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

怎么了?

3 个答案:

答案 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]]),这会导致您的结果从第一个文件名中重复所需的值。