格式化数据帧的字符向量中的字符串

时间:2017-05-31 18:35:20

标签: r dataframe

假设我有一个数据框(让我们称之为DF),如下所示:

private Foo _myFoo;
public Foo MyFoo
{
    get { return _myFoo; }
    set { _myFoo= value; OnPropertyChanged("MyFoo"); }
}

private Bar _selectedItem;
public Bar SelectedItem
{
    get { return _selectedItem; }
    set { _selectedItem = value; OnPropertyChanged("SelectedItem"); }
}

private void AddBar()
{
    Bar newBar = new Bar();

    MyFoo.BarCollection.Add(newBar);
    SelectedItem = newBar ;
    _unsavedChanges = true;
}

如果要打印它,这就是DF的样子:

 options(stringsAsFactors = F)
 letters <- c("A", "B", "C", "D", "E")
 value <- c(.44, .54, .21, .102, .002)
 test <- c("2", "c(1,4)", "1", "3:4", "c(1,2)")

 DF <- data.frame(cbind(letters, value, test))
 DF$value <- as.numeric(DF$value)

我的主要问题是DF $ test。对于任何具有多个值的单元格(即:3:4,c(1,2)),我希望单元格具有X:Y的格式,假设X和Y是数值。

有人可以帮忙吗?请注意#DF # letters value test #1 A 0.440 2 #2 B 0.540 c(1,4) #3 C 0.210 1 #4 D 0.102 3:4 #5 E 0.002 c(1,2) 是一个字符向量。

4 个答案:

答案 0 :(得分:2)

使用2 gsub s的另一个gsub选项:

DF$test2 <- gsub(",",":", gsub(".*c\\((.*)\\).*", "\\1", DF$test))
DF
#  letters value   test test2
#1       A 0.440      2     2
#2       B 0.540 c(1,4)   1:4
#3       C 0.210      1     1
#4       D 0.102    3:4   3:4
#5       E 0.002 c(1,2)   1:2

第一个gsub提取c()之间的所有内容,第二个gsub,替换为:。如果你有&gt;这将有效。您c()中的2个号码。即c(1,2,3)将成为1:2:3

答案 1 :(得分:1)

使用:

tst <- gsub('[c()]','',DF$test)
tst <- strsplit(tst, '[,:]')
DF$test <- sapply(tst, paste0, collapse = ':')

或一气呵成:

DF$test <- sapply(strsplit(gsub('[c()]','',DF$test), '[,:]'), paste0, collapse = ':')

您的data.frame现在看起来像:

> DF
  letters value test
1       A 0.440    2
2       B 0.540  1:4
3       C 0.210    1
4       D 0.102  3:4
5       E 0.002  1:2

这样做的好处是,它也适用于DF$test中超过2个数字的字符串。

答案 2 :(得分:0)

gsub应该让你到那里

DF$test <- gsub(".+(\\d+).(\\d+).+", "\\1:\\2", DF$test)

答案 3 :(得分:0)

我们可以使用str_extract

library(stringr)
DF$test <- sapply(str_extract_all(DF$test, '[0-9]+'), paste, collapse=":")
DF$test
#[1] "2"   "1:4" "1"   "3:4" "1:2"

或使用base R

DF$test <- sapply(regmatches(DF$test, gregexpr('[0-9]+', DF$test)), paste, collapse=":")
相关问题