-1

以前にも同様の質問をしましたが、私の説明が不十分だったようです。32 列の data.frame があります。この特定の基準を満たす各行の下に複製行を作成したい

df$resting == "toolong".

DWin からの提案に従って、次のコードを使用してこれを達成しました。

df[ unlist(mapply( rep, rownames(df), 1+(df$resting=="toolong"))) , ]

これで十分に機能しますが、「親」行と新しく作成された重複行の値の一部を変更する必要があります。親行の変数actiontimeを次のように設定する必要があります。

action <- "for"
time <- 60

重複する行には、変数actiontimeをに設定する必要があります

action <- "l" # which is what it is already so this can be ignored for now
time <- "parent row time" - 60 # I am unsure how to code this.

以下は、データの構造を示す data.frame の例です (元のデータベースにはさらに多くの列があります)。

id <- c(1,1,1,1,2,2,2,3,3,3)
resting <- c("f","toolong","t","f","f","toolong","t","f","toolong","t")
time <- c(23,145,34,16,17,134,67,89,123,12)
act <- c("f","l","f","d","d","l","f","d","l","d")
df <- data.frame(id, resting, time, act)

最終的な df は次のようになります。

    id resting time act
1    1       f   23   f
2    1 toolong   60   for
2.1  1 toolong   85   l
3    1       t   34   f
4    1       f   16   d
5    2       f   17   d
6    2 toolong   60   for
6.1  2 toolong   74   l
7    2       t   67   f
8    3       f   89   d
9    3 toolong   60   for
9.1  3 toolong   63   l
10   3       t   12   d

ありがとう、ティム

4

1 に答える 1

1

文字ベクトルを使用しました (以前の回答で説明したように)。

df <- data.frame(id, resting, time, act, stringsAsFactors=FALSE)

> df2 <- df[ unlist(mapply( rep, rownames(df), 1+(df$resting=="toolong"))) , ]
> df2[ df2$resting=="toolong" & !duplicated(df2) , "act"] <- "for"
> df2[ df2$resting=="toolong" & df2$act == "for" , "time"] <- 60
> df2[ df2$resting=="toolong" & df2$act == "l" , "time"] <- df2[ df2$resting=="toolong" & df2$act == "l" , "time"] - 60
> df2
    id resting time act
1    1       f   23   f
2    1 toolong   60 for
2.1  1 toolong   85   l
3    1       t   34   f
4    1       f   16   d
5    2       f   17   d
6    2 toolong   60 for
6.1  2 toolong   74   l
7    2       t   67   f
8    3       f   89   d
9    3 toolong   60 for
9.1  3 toolong   63   l
10   3       t   12   d
于 2013-10-18T21:07:30.227 に答える