在 R 中删除数据框中的相邻重复项
Removing Adjacent Duplicates in Data Frame in R
这是我在 Stack Overflow 上的第一个问题。
我在 R 中有一个数据框,其中有一百多个列应该有重复项。我不能使用 unique()
,因为我只想删除每列中与行相邻的重复项。
L = list(c("AL", "AL", "AI", "AH", "BK", "CD", "CE", "BT", "BP",
"BD", "BI", "AL"), c("AL", "AL", "AI", "AH", "BK", "AU", "BK",
"CD", "V", "CE", "CE"), c("AL", "AL", "AI", "AH", "AU", "BK",
"BQ"))
do.call(cbind, lapply(L, `length<-`, max(lengths(L))))
song 1 song 2 song 3
AL AL AL
AL AL AL
AI AI AI
AH AH AH
BK BK AU
CD AU BK
CE BK BQ
BT CD
BP V
BD CE
BI CE
AL
song 1 song 2 song 3
AL AL AL
AI AI AI
AH AH AH
BK BK AU
CD AU BK
CE BK BQ
BT CD
BP V
BD CE
BI
AL
我看到以前的答案似乎对单个列来说工作得很好。
解决方案是
df = df[with(df, c(x[-1]!= x[-nrow(df)], TRUE)),]
我见过 rle
解决方案,但它们不起作用。
考虑到我的数据框中的列长度不同,
我想知道是否有一种方法可以遍历所有列。
假设您有一个这样的列表:
songs
# $song_1
# [1] "AL" "AL" "AI" "AH" "BK" "CD" "CE" "BT" "BP" "BD" "BI" "AL"
#
# $song_2
# [1] "AL" "AL" "AI" "AH" "BK" "AU" "BK" "CD" "V" "CE" "CE"
#
# $song_3
# [1] "AL" "AL" "AI" "AH" "AU" "BK" "BQ"
与 dput
可重复共享:
songs = structure(list(song_1 = c("AL", "AL", "AI", "AH", "BK", "CD",
"CE", "BT", "BP", "BD", "BI", "AL"), song_2 = c("AL", "AL", "AI",
"AH", "BK", "AU", "BK", "CD", "V", "CE", "CE"), song_3 = c("AL",
"AL", "AI", "AH", "AU", "BK", "BQ")), .Names = c("song_1", "song_2",
"song_3"))
您可以对单个列表项中的相邻元素进行重复数据删除,类似于您在问题中使用的数据框方法。
with(songs, song_1[song_1[-1] != song_1[-length(song_1)]])
# [1] "AL" "AI" "AH" "BK" "CD" "CE" "BT" "BP" "BD" "BI"
要对列表中的所有项目执行此操作,我们使用 lapply
和匿名函数:
lapply(songs, function(s) s[s[-1] != s[-length(s)]])
# $song_1
# [1] "AL" "AI" "AH" "BK" "CD" "CE" "BT" "BP" "BD" "BI"
#
# $song_2
# [1] "AL" "AI" "AH" "BK" "AU" "BK" "CD" "V"
#
# $song_3
# [1] "AL" "AI" "AH" "AU" "BK"
当然,您可以将 lapply
的结果分配给新对象以覆盖现有对象。
请注意,由于您发布数据的方式,您的数据需要相当多的工作才能进入 R。下次请使用dput()
或分享代码创建模拟数据。
这是我在 Stack Overflow 上的第一个问题。
我在 R 中有一个数据框,其中有一百多个列应该有重复项。我不能使用 unique()
,因为我只想删除每列中与行相邻的重复项。
L = list(c("AL", "AL", "AI", "AH", "BK", "CD", "CE", "BT", "BP",
"BD", "BI", "AL"), c("AL", "AL", "AI", "AH", "BK", "AU", "BK",
"CD", "V", "CE", "CE"), c("AL", "AL", "AI", "AH", "AU", "BK",
"BQ"))
do.call(cbind, lapply(L, `length<-`, max(lengths(L))))
song 1 song 2 song 3
AL AL AL
AL AL AL
AI AI AI
AH AH AH
BK BK AU
CD AU BK
CE BK BQ
BT CD
BP V
BD CE
BI CE
AL
song 1 song 2 song 3
AL AL AL
AI AI AI
AH AH AH
BK BK AU
CD AU BK
CE BK BQ
BT CD
BP V
BD CE
BI
AL
我看到以前的答案似乎对单个列来说工作得很好。
解决方案是
df = df[with(df, c(x[-1]!= x[-nrow(df)], TRUE)),]
我见过 rle
解决方案,但它们不起作用。
考虑到我的数据框中的列长度不同,
我想知道是否有一种方法可以遍历所有列。
假设您有一个这样的列表:
songs
# $song_1
# [1] "AL" "AL" "AI" "AH" "BK" "CD" "CE" "BT" "BP" "BD" "BI" "AL"
#
# $song_2
# [1] "AL" "AL" "AI" "AH" "BK" "AU" "BK" "CD" "V" "CE" "CE"
#
# $song_3
# [1] "AL" "AL" "AI" "AH" "AU" "BK" "BQ"
与 dput
可重复共享:
songs = structure(list(song_1 = c("AL", "AL", "AI", "AH", "BK", "CD",
"CE", "BT", "BP", "BD", "BI", "AL"), song_2 = c("AL", "AL", "AI",
"AH", "BK", "AU", "BK", "CD", "V", "CE", "CE"), song_3 = c("AL",
"AL", "AI", "AH", "AU", "BK", "BQ")), .Names = c("song_1", "song_2",
"song_3"))
您可以对单个列表项中的相邻元素进行重复数据删除,类似于您在问题中使用的数据框方法。
with(songs, song_1[song_1[-1] != song_1[-length(song_1)]])
# [1] "AL" "AI" "AH" "BK" "CD" "CE" "BT" "BP" "BD" "BI"
要对列表中的所有项目执行此操作,我们使用 lapply
和匿名函数:
lapply(songs, function(s) s[s[-1] != s[-length(s)]])
# $song_1
# [1] "AL" "AI" "AH" "BK" "CD" "CE" "BT" "BP" "BD" "BI"
#
# $song_2
# [1] "AL" "AI" "AH" "BK" "AU" "BK" "CD" "V"
#
# $song_3
# [1] "AL" "AI" "AH" "AU" "BK"
当然,您可以将 lapply
的结果分配给新对象以覆盖现有对象。
请注意,由于您发布数据的方式,您的数据需要相当多的工作才能进入 R。下次请使用dput()
或分享代码创建模拟数据。