0

我有 3 列。第一列具有唯一 ID,第二列和第三列具有字符串数据和一些 NA 数据。我需要从第 2 列中提取信息并将其放在单独的列中,并对第 3 列执行相同的操作。我正在使用 for 循环构建如下函数。我需要在第三个字母之后拆分列。[例如在下面的 V1 列中,我需要将 AAAbbb 分解为 AAA 和 bbb 并将它们放在单独的列中。我知道我可以使用 substr 来做到这一点。我是R新手,请帮忙。


UID * V1 * V2 *


Z001NL * AAAbbb * IADSFO *


Z001NP * IADSFO * 不适用 *


Z0024G * SFOHNL * NLSFO0 *


这是我的代码。

test=read.csv("c:/some/path/in/windows/test.csv", header=TRUE)

substring_it = function(test)
{
for(i in 1:3){
for(j in 2:3){
answer = transform(test, code 1 = substr((test[[j,i]]), 1, 3), code2 = substr((test[j,i]), 4, 6))

}
}
return(answer)

}

hello = substring_it(test)

test 将是我将读入的数据框。

我需要这个作为我的输出


UID * V1.1 * V1.2 * V2.1 * V2.2


Z001NL * AAA * bbb * IAD * SFO


Z001NP * IAD * SFO * 不适用 * 不适用


Z0024G * SFO * HNL * NLS * SFO


4

1 回答 1

2

您可以使用sapply将函数应用于向量的每个元素 - 这在这里可能很有用,因为您可以在原始数据框(测试)的列上使用 sapply 来为新数据框创建列。

这是一个解决方案:

test = data.frame(UID = c('Z001NL', 'Z001NP', 'Z0024G'), 
  V1 = c('AAAbbb', 'IADSFO', 'SFOHNL'),
  V2 = c('IADSFO', NA, 'NLSFO0'))

substring_it = function(x){
  # x is a data frame
  c1 = sapply(x[,2], function(x) substr(x, 1, 3))
  c2 = sapply(x[,2], function(x) substr(x, 4, 6))
  c3 = sapply(x[,3], function(x) substr(x, 1, 3))
  c4 = sapply(x[,3], function(x) substr(x, 4, 6))
  return(data.frame(UID=x[,1], c1, c2, c3, c4))
}

substring_it(test)
# returns:
#     UID  c1  c2   c3   c4
#1 Z001NL AAA bbb  IAD  SFO
#2 Z001NP IAD SFO <NA> <NA>
#3 Z0024G SFO HNL  NLS  FO0

编辑:如果您必须多次执行此操作,这是一种循环列的方法。我不确定您的原始数据框列的顺序以及您希望新数据框的列以什么顺序结束,因此您可能需要使用“pos”计数器。我还假设要拆分的列是第 2 到 201 列(“colindex”),所以你可能不得不改变它。

newcolumns = list()
pos = 1 #counter for column index of new data frame
for(colindex in 2:201){
    newcolumns[[pos]] = sapply(test[,colindex], function(x) substr(x, 1, 3))
    newcolumns[[pos+1]] = sapply(test[,colindex], function(x) substr(x, 4, 6))
    pos = pos+2
}
newdataframe = data.frame(UID = test[,1], newcolumns)
# update "names(newdataframe)" as needed
于 2014-01-02T21:48:56.383 回答