从数据框中导出唯一 ID 计数并为计数和值创建新列
Deriving number of unique ID counts from a data frame and creating new columns for counts and values
我有一个数据框 reshape/counting 问题。考虑以下具有一列非唯一 ID 和一列值的数据框(可以是唯一的,但不一定是):
id<-c(1,1,1,2,2,3,4,4,4,4)
value_df<-c("A","B","C","D","E","F","G","H","I","J")
df<-data.frame(id,value_df)
df
id value_df
1 1 A
2 1 B
3 1 C
4 2 D
5 2 E
6 3 F
7 4 G
8 4 H
9 4 I
10 4 J
我要做的是创建一个数据框,其中第一列包含唯一 ID,第二列包含这些的计数,其余 n 列包含每个 ID 的值,如下所示:
df_counts_reshape
id number_id value_df_1 value_df_2 value_df_3 value_df_4
1 1 3 A B C N
2 2 2 D E <NA> <NA>
3 3 1 F <NA> <NA> <NA>
4 4 4 G I J K
使用 plyr-package 推导计数很容易,就像这样
count(df,"id")
但我的问题开始了。为了获得数据框的其余部分,我尝试了 melt 和 dcast 来自 reshape2-package.
df_melted<-melt(df,id.vars =c("id"), measure.vars = c("value_df"))
df_cast<-dcast(df_melted,id~value)
但是,这会导致以下输出:
df_cast
id A B C D E F G H I J
1 1 A B C <NA> <NA> <NA> <NA> <NA> <NA> <NA>
2 2 <NA> <NA> <NA> D E <NA> <NA> <NA> <NA> <NA>
3 3 <NA> <NA> <NA> <NA> <NA> F <NA> <NA> <NA> <NA>
4 4 <NA> <NA> <NA> <NA> <NA> <NA> G H I J
此输出的 "value" 列比我希望的多很多,但我找不到简单的方法将其简化为上面我想要的输出。我还认为获取 number_id 的最后一步是使用 rbind。
不用说,我的实际数据帧包含数千行,这使得当前的 melt/dcast 输出非常笨拙,有数千列。
使用这个:
df<-data.frame(id,value_df)
df$num <- ave(as.character(df$value_df), df$id, FUN = seq_along)
df = reshape(df,idvar = "id",direction = "wide",timevar = "num" )
结果:
> df
id value_df.1 value_df.2 value_df.3 value_df.4
1 1 A B C <NA>
4 2 D E <NA> <NA>
6 3 F <NA> <NA> <NA>
7 4 G H I J
它的作用是为每组 ID 添加一个序列 1:n 的数字列。然后它使用这些值作为新的列名
我有一个数据框 reshape/counting 问题。考虑以下具有一列非唯一 ID 和一列值的数据框(可以是唯一的,但不一定是):
id<-c(1,1,1,2,2,3,4,4,4,4)
value_df<-c("A","B","C","D","E","F","G","H","I","J")
df<-data.frame(id,value_df)
df
id value_df
1 1 A
2 1 B
3 1 C
4 2 D
5 2 E
6 3 F
7 4 G
8 4 H
9 4 I
10 4 J
我要做的是创建一个数据框,其中第一列包含唯一 ID,第二列包含这些的计数,其余 n 列包含每个 ID 的值,如下所示:
df_counts_reshape
id number_id value_df_1 value_df_2 value_df_3 value_df_4
1 1 3 A B C N
2 2 2 D E <NA> <NA>
3 3 1 F <NA> <NA> <NA>
4 4 4 G I J K
使用 plyr-package 推导计数很容易,就像这样
count(df,"id")
但我的问题开始了。为了获得数据框的其余部分,我尝试了 melt 和 dcast 来自 reshape2-package.
df_melted<-melt(df,id.vars =c("id"), measure.vars = c("value_df"))
df_cast<-dcast(df_melted,id~value)
但是,这会导致以下输出:
df_cast
id A B C D E F G H I J
1 1 A B C <NA> <NA> <NA> <NA> <NA> <NA> <NA>
2 2 <NA> <NA> <NA> D E <NA> <NA> <NA> <NA> <NA>
3 3 <NA> <NA> <NA> <NA> <NA> F <NA> <NA> <NA> <NA>
4 4 <NA> <NA> <NA> <NA> <NA> <NA> G H I J
此输出的 "value" 列比我希望的多很多,但我找不到简单的方法将其简化为上面我想要的输出。我还认为获取 number_id 的最后一步是使用 rbind。
不用说,我的实际数据帧包含数千行,这使得当前的 melt/dcast 输出非常笨拙,有数千列。
使用这个:
df<-data.frame(id,value_df)
df$num <- ave(as.character(df$value_df), df$id, FUN = seq_along)
df = reshape(df,idvar = "id",direction = "wide",timevar = "num" )
结果:
> df
id value_df.1 value_df.2 value_df.3 value_df.4
1 1 A B C <NA>
4 2 D E <NA> <NA>
6 3 F <NA> <NA> <NA>
7 4 G H I J
它的作用是为每组 ID 添加一个序列 1:n 的数字列。然后它使用这些值作为新的列名