楼主: bayes
1568 6

[问答] 怎么扩展数据框? [推广有奖]

  • 1关注
  • 0粉丝

博士生

20%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
1 点
热心指数
0 点
信用等级
0 点
经验
1172 点
帖子
78
精华
0
在线时间
419 小时
注册时间
2005-11-5
最后登录
2021-11-14

楼主
bayes 发表于 2012-11-7 15:33:17 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
编程的时候遇到的一个简单的问题。
比如有数据框如下
     v1     v2
1   a        1
2   b,c   2

我想把它展开,v1里面的每个变量作为一行观测值,也就是输出成这样:
    v1       v2
1  a          1
2  b          2
3  c          2

有没有什么解放方法?
我目前用的循环,问题是这个文件有4000+观测值,时间消耗太大了
有没有以向量的方式来处理的呢?

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据框 有没有 观测值

你的名字在这看http://xufeiyy.com/detail/?45958.html

沙发
qoiqpwqr 发表于 2012-11-7 17:12:19
  1. > x <- data.frame(v1=c("a", "b,c"), v2 = c(1, 2))
  2. > x
  3.    v1 v2
  4. 1   a  1
  5. 2 b,c  2
  6. > y <- strsplit(v1, split = ",")
  7. > y
  8. [[1]]
  9. [1] "a"

  10. [[2]]
  11. [1] "b" "c"

  12. > vv1 <- unlist(y)
  13. > vv1
  14. [1] "a" "b" "c"
  15. > len <- unlist(lapply(y, length))
  16. > vv2 <- rep(v2, len)
  17. > newx <- data.frame(v1 = vv1, v2 = vv2)
  18. > newx
  19.   v1 v2
  20. 1  a  1
  21. 2  b  2
  22. 3  c  2
复制代码
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
UNC + 1 + 1 + 1 精彩帖子
AspenRd + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

藤椅
trier2006 发表于 2012-11-7 19:14:19
qoiqpwqr 发表于 2012-11-7 17:12
学习了
最好的医生是自己,最好的药物是时间……

板凳
bayes 发表于 2012-11-13 15:03:10
qoiqpwqr 发表于 2012-11-7 17:12
可以了,感谢~
不过在实际应用中有一个问题,就是我的列不止2个,这个例子简化了。
当有很多列的时候,中间那句:
rep(v2,len)
过不去,因为此时v2不再是一个vector,而成了一个data frame,rep命令就不行了。
一个简便的办法是逐列rep,问题是我有30列,稍显繁琐。
请问还有没有其他命令可以简单的重复data frame的某些行?
你的名字在这看http://xufeiyy.com/detail/?45958.html

报纸
qoiqpwqr 发表于 2012-11-13 23:01:40
bayes 发表于 2012-11-13 15:03
可以了,感谢~
不过在实际应用中有一个问题,就是我的列不止2个,这个例子简化了。
当有很多列的时候, ...
把那句改成
vv2 <- apply(x[, -1], 2, rep, len)

地板
bayes 发表于 2012-11-14 01:22:11
qoiqpwqr 发表于 2012-11-13 23:01
把那句改成
vv2
原来如此,还是apply族函数用的不熟啊,呵呵~
你的名字在这看http://xufeiyy.com/detail/?45958.html

7
bayes 发表于 2012-11-16 15:31:23
qoiqpwqr 发表于 2012-11-13 23:01
把那句改成
vv2
不好意思,我发现另外一个问题,继续问一下。
我还有一列,每个观测值就两个元素,‘;’分开。还是想像前面那样分。形成两列。塞回原数据框即可。
我是这样写的:
  1. s = as.data.frame(strsplit(as.character(test[,15]),';'))
  2. s1 = s[1,]
  3. s2 = s[2,]
  4. res1 = res[,1:14]
  5. res2 = res[,16:50]
  6. res = data.frame(res1,s1,s2,res2)
复制代码

问题就在最后一句,形不成我想要的数据框。
我试过cbind命令,也不行。
我在想是不是因为s1和s2分离出来的是两行而不是两列的原因呢?
请指教一下怎么解决~
你的名字在这看http://xufeiyy.com/detail/?45958.html

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-19 02:35