[英]R: reshaping data frame - add column(s), while keeping row index values consistent
[英]R add index column to data frame based on row values
我嘗試使用綠色選中的答案來復制我認為是期望的結果,並且一直得到預期之外的結果。 我確定我確實在做一些基本的錯誤,但似乎看不到它,或者我誤解了所需的狀態。
來自原始帖子的數據:
temp <- data.frame(
Dim1 = c("A","A","A","A","A","A","B","B"),
Dim2 = c(100,100,100,100,200,200,100,200),
Value = sample(1:10, 8)
)
然后我運行以下代碼: temp$indexLength <- ave( 1:nrow(temp), temp$Dim1, factor( temp$Dim2), FUN=function(x) 1:length(x) )
和: temp$indexSeqAlong <- ave( 1:nrow(temp), temp$Dim1, factor( temp$Dim2), FUN=seq_along )
然后創建以下內容: temp$indexDesired <- c(1, 1, 1, 1, 2, 2, 3, 3)
...最后顯示以下數據框:
Dim1 Dim2 Value indexLength indexSeqAlong indexDesired
1 A 100 6 1 1 1
2 A 100 2 2 2 1
3 A 100 9 3 3 1
4 A 100 8 4 4 1
5 A 200 10 1 1 2
6 A 200 4 2 2 2
7 B 100 3 1 1 3
8 B 200 5 1 1 4
如果我能弄清我沒有得到想要的索引的原因-並假設代碼可以擴展到兩個以上的變量-我應該被設置好。 提前致謝!
如果使用data.table
,則有一個“ symbol” .GRP
記錄此信息(一個簡單的組計數器)
library(data.table)
DT <- data.table(temp)
DT[, index := .GRP, by = list(Dim1, Dim2)]
DT
# Dim1 Dim2 Value index
# 1: A 100 10 1
# 2: A 100 2 1
# 3: A 100 9 1
# 4: A 100 4 1
# 5: A 200 6 2
# 6: A 200 1 2
# 7: B 100 8 3
# 8: B 200 7 4
一旦第一個參數中的值被分區,就無法“知道”它們的傳遞順序。 您需要一種可以查看值更改的方法。 duplicated
函數是通用的,並且具有data.frame方法,該方法查看多個列:
temp$indexSeqAlong <- cumsum(!duplicated(temp[, 1:2]) )
temp
Dim1 Dim2 Value indexSeqAlong
1 A 100 8 1
2 A 100 2 1
3 A 100 7 1
4 A 100 3 1
5 A 200 5 2
6 A 200 1 2
7 B 100 4 3
8 B 200 10 4
可擴展為任意數量的列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.