楼主: 熊小贤
3200 22

[问答] 请教一个R语言编程小问题 [推广有奖]

  • 2关注
  • 0粉丝

等待验证会员

已卖:66份资源

本科生

75%

还不是VIP/贵宾

-

威望
0
论坛币
1102 个
通用积分
0.0600
学术水平
4 点
热心指数
6 点
信用等级
1 点
经验
461 点
帖子
36
精华
0
在线时间
169 小时
注册时间
2013-3-25
最后登录
2021-6-7

楼主
熊小贤 发表于 2013-10-13 10:26:10 |AI写论文
200论坛币
假设我有一组数据
id             name           value
1             jin, joy           1
2              jou                6
3              po, yu           3
4              gh                 3
5              kl, yu             2
6              tt                   5
7              ttk                 1
8              dd, bbs,tt    9
9              irr                  2
10            jii                   3
我想把第二列中有逗号分隔的名字分开(有的可能有很多逗号分隔的名字不止两三个),并输出到下一行,没有逗号的不动:
希望输出结果这样:
id             name        value
1             jin               1
1             joy              1
2              jou             6
3              po              3
3              yu              3
4              gh              3
5              kl               2
5              yu              2
6              tt               5
7              ttk              1
8              dd              9
8             bbs              9
8              tt                9
9              irr                2
10            jii                 3
希望各位大神不吝指点,非常感谢!!

最佳答案

统计R浪人 查看完整内容

> id name value newdata newdata id name value 1 1 jin 1 2 1 joy 1 3 2 jou 6 4 3 po 3 5 3 yu 3 6 4 gh 3 7 5 kl 2 8 5 yu 2 9 6 tt 5 10 7 ttk 1 11 8 dd 9 12 8 bbs 9 13 8 tt 9 14 9 irr 2 15 10 jii 3 >
关键词:R语言编程 语言编程 R语言 小问题 value 语言编程
已有 1 人评分热心指数 收起 理由
耕耘使者 + 1 鼓励积极发帖讨论

总评分: 热心指数 + 1   查看全部评分

沙发
统计R浪人 发表于 2013-10-13 10:26:11
> id<-newid
> name<-newname
> value<-newvalue
> newdata<-data.frame(id,name,value)
> newdata
   id name value
1   1  jin     1
2   1  joy     1
3   2  jou     6
4   3   po     3
5   3  yu      3
6   4   gh     3
7   5   kl     2
8   5   yu     2
9   6   tt     5
10  7  ttk     1
11  8   dd     9
12  8  bbs     9
13  8   tt     9
14  9  irr     2
15 10 jii      3
>
  1. rm(list=ls())
  2. id<-1:10
  3. name<-c("jin, joy","jou"," po, yu ","gh","kl, yu","tt","ttk","dd,bbs,tt","irr","jii ")
  4. value<-c(1,6,3,3,2,5,1,9,2,3)
  5. data<-data.frame(id,name,value)
  6. newname<-as.character(data$name)
  7. newid<-0
  8. newvalue<-0
  9. j<-1
  10. for(i in 1:nrow(data))
  11.    {
  12.       t<-strsplit(as.character(data$name[i]), ",")
  13.       if(ncol(t(t[[1]]))>=2)
  14.          {
  15.             
  16.              newid[j:(j-1+ncol(t(t[[1]])))]<-data$id[i]
  17.              newname[j:(j-1+ncol(t(t[[1]])))]<-t[[1]]
  18.              newvalue[j:(j-1+ncol(t(t[[1]])))]<-data$value[i]
  19.              j<-ncol(t(newid))
  20.              j<-j+1
  21.             
  22.          }
  23.        if(ncol(t(t[[1]]))==1)
  24.          {
  25.             
  26.              newid[j]<-data$id[i]
  27.              newname[j]<-as.character(data$name[i])
  28.              newvalue[j]<-data$value[i]

  29.              j<-j+1
  30.           }
  31.    }
  32. id<-newid
  33. name<-newname
  34. value<-newvalue
  35. newdata<-data.frame(id,name,value)
  36. newdata
复制代码
已有 1 人评分论坛币 热心指数 收起 理由
qoiqpwqr + 20 + 1 热心帮助其他会员

总评分: 论坛币 + 20  热心指数 + 1   查看全部评分

藤椅
熊小贤 发表于 2013-10-13 10:52:00
现在这里谢谢了

板凳
nieqiang110 学生认证  发表于 2013-10-13 19:10:25
你好!假定你的数据名为data,你要转换的列为name
data$name<-gsub(","," ",data$name) #去掉逗号“,”注意双引号中有一个空格,这样才是几个单词。谨记。
regexp<-"([[:alpha:]]+) ([[:alpha:]]+) ([[:alpha:]]+)" #定义你的名字中最多的单词表达模式,你的例子中是3个。如果是4个,就是regexp<-"([[:alpha:]]+) ([[:alpha:]]+) ([[:alpha:]]+) ([[:alpha:]]+) "
data$name<-sub(pattern=regexp,replacement="\\1",x=data$name) #将3个单词的名字转换为1个单词
regexp<-"([[:alpha:]]+)  ([[:alpha:]]+)"  #定义你的名字中2个单词的表达模式。
data$name<-sub(pattern=regexp,replacement="\\1",x=data$name) #将2个单词的名字转换为1个单词
data$name #显示最终结果
#注意一定要按顺序来,不可倒换顺序,否则出错。

报纸
熊小贤 发表于 2013-10-13 19:42:36
nieqiang110 发表于 2013-10-13 19:10
你好!假定你的数据名为data,你要转换的列为name
data$name
您没明白我的意思 我是想输出结果直接显示成
id             name        value
1             jin               1
1             joy              1
2              jou             6
3              po              3
3              yu              3
4              gh              3
5              kl               2
5              yu              2
6              tt               5
7              ttk              1
8              dd              9
8             bbs              9
8              tt                9
9              irr                2
10            jii                 3

不是单纯对第二列操作

地板
nieqiang110 学生认证  发表于 2013-10-13 20:37:06
哈哈哈,
你好!假定你的数据名为data,你要转换的列为name
data$name<-gsub(","," ",data$name) #去掉逗号“,”注意双引号中有一个空格,这样才是几个单词。谨记。
regexp<-"([[:alpha:]]+) ([[:alpha:]]+) ([[:alpha:]]+)" #定义你的名字中最多的单词表达模式,你的例子中是3个。如果是4个,就是regexp<-"([[:alpha:]]+) ([[:alpha:]]+) ([[:alpha:]]+) ([[:alpha:]]+) "
data$name<-sub(pattern=regexp,replacement="\\1",x=data$name) #将3个单词的名字转换为1个单词
regexp<-"([[:alpha:]]+)  ([[:alpha:]]+)"  #定义你的名字中2个单词的表达模式。
data$name<-sub(pattern=regexp,replacement="\\1",x=data$name) #将2个单词的名字转换为1个单词
data$name #显示最终结果
#注意一定要按顺序来,不可倒换顺序,否则出错。
data

7
nieqiang110 学生认证  发表于 2013-10-13 20:39:18
你的原始数据名为data,第二列修改后,数据自然显示好了。给我的程序加一行,写上数据名,自然就好了

8
童小军 发表于 2013-10-13 22:24:30
  1. data<-read.csv('data.csv',header=T)
  2. data$name<-gsub(","," ",data$name)
  3. regexp<-"([[:alpha:]]+) ([[:alpha:]]+) ([[:alpha:]]+)"
  4. data$name<-sub(pattern=regexp,replacement="\\1",x=data$name)
  5. regexp<-"([[:alpha:]]+) ([[:alpha:]]+)"
  6. data$name<-sub(pattern=regexp,replacement="\\1",x=data$name)
  7. data$name
  8. data
复制代码

data.rar (193 Bytes) 本附件包括:
  • data.csv


根据上面的方法,还是得不到想要的结果??

9
ywh19860616 发表于 2013-10-13 23:41:15
nieqiang110 发表于 2013-10-13 19:10
你好!假定你的数据名为data,你要转换的列为name
data$name
正则表达式用的很好,学习了。
一份耕耘,一份收获。

10
nieqiang110 学生认证  发表于 2013-10-14 00:05:31
X<-"ax"
Y<-"as,vy"
Z<-"ss,rr,tt"
M<-c(X,Y,Z)
M<-gsub(","," ",M)
M
regexp<-"([[:alpha:]]+) ([[:alpha:]]+) ([[:alpha:]]+)"
M<-sub(pattern=regexp,replacement="\\1",x=M);M
regexp<-"([[:alpha:]]+) ([[:alpha:]]+)"
M<-sub(pattern=regexp,replacement="\\1",x=M);M

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 17:50