将值从一个数据帧表示到另一个数据帧。申请?申请?

发布于 2024-12-02 03:01:56 字数 671 浏览 0 评论 0原文

我有以下数据框

data<-data.frame(ID=c("a", "b", "c", "d"), zeros=c(3,2,5,4), ones=c(1,1,2,1))


   ID zeros ones
1  a     3    1
2  b     2    1
3  c     5    2
4  d     4    1

,我希望创建另一个包含 2 列的数据框:

第一列(id) ID 重复(零+个)次 第二列值应该是 c(rep(0,zeros),rep(1,ones)),

这样结果就是

    id value
1   a  0
2   a  0
3   a  0
4   a  1
5   b  0
6   b  0
7   b  1
8   c  0
9   c  0
10  c  0
11  c  0
12  c  0
13  c  1
14  c  1
15  d  0
16  d  0
17  d  0
18  d  0
19  d  1

我尝试的 data.frame(id=(rep(data$ID, (data$zeros) +data$ones))), value=c(rep(0, data$zeros), rep(1, data$ones))) 但不起作用。有什么想法吗?先感谢您

I have the following data frame

data<-data.frame(ID=c("a", "b", "c", "d"), zeros=c(3,2,5,4), ones=c(1,1,2,1))


   ID zeros ones
1  a     3    1
2  b     2    1
3  c     5    2
4  d     4    1

and I wish to create another data frame with 2 columns:

First column(id) the ID is repeated (zero+ones) times
Second column value should be the c(rep(0, zeros), rep(1, ones))

so that the result would be

    id value
1   a  0
2   a  0
3   a  0
4   a  1
5   b  0
6   b  0
7   b  1
8   c  0
9   c  0
10  c  0
11  c  0
12  c  0
13  c  1
14  c  1
15  d  0
16  d  0
17  d  0
18  d  0
19  d  1

I tried data.frame(id=(rep(data$ID, (data$zeros+data$ones))), value=c(rep(0, data$zeros), rep(1, data$ones))) but doesnt work. Any ideas? Thank you in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

峩卟喜欢 2024-12-09 03:01:56

使用 plyr 包中的 ddply 可能有点矫枉过正,但这是我想到的第一件事:

ddply(dat,.(ID),function(x){data.frame(value = rep(c(0,1),times = c(x$zeros,x$ones)))})

哦,我将数据框的名称更改为 dat 以避免坏习惯(data 是一个经常使用的函数的名称)。

This is perhaps overkill, using ddply from the plyr package, but it's the first thing that came to me:

ddply(dat,.(ID),function(x){data.frame(value = rep(c(0,1),times = c(x$zeros,x$ones)))})

Oh and I changed the name of your data frame to dat to avoid a bad habit (data is the name of an oft used function).

没︽人懂的悲伤 2024-12-09 03:01:56

这是一个基本的 R 解决方案。我自己更喜欢 plyr 的过度杀伤力:

dat <- data.frame(ID = letters[1:4], zeros = c(3,2,5,4), ones = c(1,1,2,1))

do.call("rbind"
    , apply(dat, 1, function(x) 
        data.frame(cbind(id = x[1], value = rep(0:1, times = x[2:3])))
    )
)

Here's a base R solution. I prefer the overkill of plyr myself:

dat <- data.frame(ID = letters[1:4], zeros = c(3,2,5,4), ones = c(1,1,2,1))

do.call("rbind"
    , apply(dat, 1, function(x) 
        data.frame(cbind(id = x[1], value = rep(0:1, times = x[2:3])))
    )
)
合约呢 2024-12-09 03:01:56

由于您已经获得了第一列的基本 R 解决方案,因此这是第二列的解决方案:

lengths<-as.vector(t(as.matrix(data[,2:3]))) #notice the t
what<-rep(c(0,1), nrow(data))
times<-rep(what, lengths)

编辑:更改了上面的一个小问题并对其进行了测试。现在可以了。

Since you've already got a base R solution for the first column, this is one for your second column:

lengths<-as.vector(t(as.matrix(data[,2:3]))) #notice the t
what<-rep(c(0,1), nrow(data))
times<-rep(what, lengths)

Edit: changed a minor thing above and tested it. It works now.

执笔绘流年 2024-12-09 03:01:56

我也更喜欢 plyr 方法,但我想我应该抛出另一个与首先重塑数据然后复制数据相关的基本 R 解决方案。 (也使用 dat 而不是 data):

names(dat)[2:3] <- c("times.0", "times.1")
tmp <- reshape(dat, varying=2:3, direction="long")
tmp <- tmp[rep(seq(length=nrow(tmp)),tmp$times),c("ID","time")]
names(tmp) <- c("id","value")
tmp <- tmp[order(tmp$id, tmp$value),]
rownames(tmp) <- NULL

不像其他一些基本解决方案那么优雅,因为它需要中间存储,但可能很有趣。

I also prefer the plyr method, but I thought I'd throw another base R solution related to reshaping the data first, and then replicating it. (also using dat instead of data):

names(dat)[2:3] <- c("times.0", "times.1")
tmp <- reshape(dat, varying=2:3, direction="long")
tmp <- tmp[rep(seq(length=nrow(tmp)),tmp$times),c("ID","time")]
names(tmp) <- c("id","value")
tmp <- tmp[order(tmp$id, tmp$value),]
rownames(tmp) <- NULL

Not as elegant as some of the other base solutions because it requires intermediate storage, but possibly interesting.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文