R - 跨数据框列重复子字符串任务

时间:2014-11-15 05:22:06

标签: r loops iteration transformation

SAS中非常简单的问题,在R(初学者)中对我来说不是那么清楚。

ID <- c('001','002','003')
name1 <- c('ZZ: John','YY: Pete','UU: Judy')
name2 <- c('55: Smith','78: Philips','99: Cortes')
name3 <- c('BB: Jr.','CC: Mr.','56: Dr.')
customer.data <- data.frame(ID, name1, name2, name3)
  • 显然是一个愚蠢的例子,但它捕获了我的数据结构

我想从每个变量中删除前4个字符(包括空格),输出如下所示:

ID  name1 name2 name3
001 John Smith Jr.
002 Pete Philips Mr.
003 Judy Cortes Dr.

....我需要在一长串变量上做这个(不仅仅是3,就像我的例子中一样)。 相同的子串函数一遍又一遍,然后重写数据帧,如图所示。

我可以在SAS中轻松完成这项工作(我的遗产计划/试图摆脱)

ARRAY FIRSTSTUFF (3) name1 name2 name3;
ARRAY OUTPUTSTUFF (3) name1 name2 name3;
do i=1 to 3;
FORMAT OUTPUTSTUFF(i) $10.;
OUTPUTSTUFF(i)=substring(FIRSTSTUFF(i),5,10);
end;

我对R的方法感到困惑。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

我们使用customer.data[,-1]循环遍历'customer.data'列除了第一个(lapply),使用{{1}从第5个字符提取子字符串到字符串的最后一个字符},并将输出分配回数据集的相应列。

substr

或者在上文中,如果您使用的是 customer.data[,-1] <- lapply(customer.data[,-1], function(x) substr(x,5,nchar(as.character(x)))) customer.data # ID name1 name2 name3 #1 001 John Smith Jr. #2 002 Pete Philips Mr. #3 003 Judy Cortes Dr. 而不是stop,则不必指定substring(正如@Richard Scriven在评论中所示)

substr

或者您可以使用 customer.data[,-1] <- lapply(customer.data[-1], substring, 5) 来匹配字符(gsub - 0个或更多字符)从开头到.*后跟空格:,并替换它以+作为''循环的每个列的第二个参数。

lapply