假设我有一个数据框(让我们称之为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)
是一个字符向量。
答案 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=":")