更改结构表

时间:2017-05-29 11:29:40

标签: r

首先,我要感谢大家的帮助。当我被封锁时,我在这个网站上找到了很多解决方案!

其次,我对性能有一个问题:问: 我有一张这样的桌子:

Col1 ; Col2
Entry   X1
Home    X2
Code    X3
Entry   Y1
Home    Y2
Code    Y3

我想要这个:

Col1 ; Col2
X1   ; X2
X1   ; X3
Y1   ; Y2
Y1   ; Y3

我设法做一些东西,带有for循环:

for (i in 1:nrow(DateFrame)){    
if(DateFrame[i,1]=="entryId")
{
entryid<-DateFrame[i,2]
}
else {}
DateFrame[i,3]<-entryid}

它与2000行完美配合。但不幸的是,我有3000万行,加载1小时后仍然没有结果(1小时后i = 50 000 ......)

有人可以帮助我解决这个问题吗?

谢谢!

编辑:这里是日期框架来源

df_source = read.table(text = 'V1   V2
entryId 2501100010101820
HomeStore   10,00
Customer    101826
HomeStore   10
Customer    101826
HomeStore   10
Customer    101826
HomeStore   10
Customer    101826
entryId 2501100010101940
HomeStore   10
Customer    101942
HomeStore   10
Customer    101942
HomeStore   10
Customer    101942
HomeStore   10
Customer    101942
entryId 2501100010101990
HomeStore 10
Customer    101999
HomeStore   10
Customer    101999
HomeStore   10
Customer    101999', header = TRUE)

这里是我想要的数据框

df_result = read.table(text = 'V1   V2 Copy
entryId 2501100010101820    2501100010101820
HomeStore   10  2501100010101820
Customer    101826  2501100010101820
HomeStore   10  2501100010101820
Customer    101826  2501100010101820
HomeStore   10  2501100010101820
Customer    101826  2501100010101820
HomeStore   10  2501100010101820
Customer    101826  2501100010101820
entryId 2501100010101940    2501100010101940
HomeStore   10  2501100010101940
Customer    101942  2501100010101940
HomeStore   10  2501100010101940
Customer    101942  2501100010101940
HomeStore   10  2501100010101940
Customer    101942  2501100010101940
HomeStore   10  2501100010101940
Customer    101942  2501100010101940
entryId 2501100010101990    2501100010101990 ', header = TRUE)

1 个答案:

答案 0 :(得分:1)

我们将首先创建一个零向量,只要该表有行。

然后我们将向量设置为1对应于表中“entryId”行的元素。

如果我们对这个向量进行累加求和,我们将为每个entryId和后续行(如Homestore等)提供一个常量id ...

然后我们将这些ID映射到我们正在寻找的entryId的实际坐标。

最后我们添加你想要的列。

entry_flags <- rep(0,nrow(df_source))
entry_flags[which(df_source$V1 == "entryId")] <- 1
entry_row_ids <- which(df_source$V1 == "entryId")
copy_row_ids <- entry_row_ids[cumsum(entry_flags)]
df_source$Copy <- df_source$V2[copy_row_ids]

(请参阅另一个低效解决方案的编辑历史记录)