我只是有一个简单的问题,我非常感谢每个人的投入,你对我的项目有很大的帮助。我还有一个关于R中数据框的问题。
我的数据框看起来像这样:
C <- c("","","","","","","","A","B","D","A","B","D","A","B","D")
D <- c(NA,NA,NA,2,NA,NA,1,1,4,2,2,5,2,1,4,2)
G <- list(C=C,D=D)
T <- as.data.frame(G)
T
C D
1 NA
2 NA
3 NA
4 2
5 NA
6 NA
7 1
8 A 1
9 B 4
10 D 2
11 A 2
12 B 5
13 D 2
14 A 1
15 B 4
16 D 2
我希望能够将所有重复字符压缩成一个,看起来类似于:
J B C E
1 2 1
2 A 1 2 1
3 B 4 5 4
4 D 2 2 2
当然,数据完全相同,只是它被压缩并形成新列来保存数据。我确信有一种简单的方法可以做到这一点,但从我看过的书中,我还没有看到任何东西!
编辑我编辑了这个例子,因为它到目前为止还没有使用答案。我想知道空白的NA,空白和不均匀是否有贡献?
答案 0 :(得分:1)
这是一个重塑解决方案:
require(reshape)
cast(T, C ~ ., function(x) x)
答案 1 :(得分:1)
将T改为df以避免坏习惯。返回一个列表,我不是你想要的,但你可以从那里转换。
C <- c("A","B","D","A","B","D","A","B","D")
D <- c(1,4,2,2,5,2,1,4,2)
my.df <- data.frame(id=C,val=D)
ret <- function(x) x
by.df <- by(my.df$val,INDICES=my.df$id,ret)
答案 2 :(得分:1)
此似乎可以获得您要查找的结果。我假设可以删除NA
值,因为它与您显示的所需输出相匹配。
T <- na.omit(T)
T$ind <- ave(1:nrow(T), T$C, FUN = seq_along)
reshape(T, direction = "wide", idvar = "C", timevar = "ind")
# C D.1 D.2 D.3
# 4 2 1 NA
# 8 A 1 2 1
# 9 B 4 5 4
# 10 D 2 2 2
library(reshape2)
dcast(T, C ~ ind, value.var = "D", fill = "")
# C 1 2 3
# 1 2 1
# 2 A 1 2 1
# 3 B 4 5 4
# 4 D 2 2 2