楼主: Imasasor
2108 1

[问答] which函数的用法 [推广有奖]

  • 1关注
  • 64粉丝

VIP

已卖:215份资源

学科带头人

33%

还不是VIP/贵宾

-

TA的文库  其他...

超哥喜欢的文章

威望
1
论坛币
47033 个
通用积分
3.1376
学术水平
238 点
热心指数
246 点
信用等级
231 点
经验
37132 点
帖子
849
精华
3
在线时间
2235 小时
注册时间
2012-7-4
最后登录
2024-10-10

初级学术勋章 初级热心勋章 初级信用勋章 中级热心勋章 中级学术勋章

楼主
Imasasor 发表于 2016-8-15 17:34:06 |AI写论文
388论坛币
求教高手

有两个数据框,

其中A格式为

中国、美国                1
德国                          6
日本、朝鲜                10

B数据格式为

中国                  
德国、法国      
泰国
美国

想要在B框中,加上一列,值为A框中的数字,条件是:A中的国家名包含B中该行的国家名,或B中该行的国家名包含A中的国家名

得到结果为


中国             1
德国、法国   6
泰国            NA
美国             1


关键词:Which 数据格式 数据框 泰国 日本 朝鲜 中国 美国
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

沙发
robbieyeah 发表于 2016-8-16 01:21:59
这个东西用which比较难写, 而且直接在这两个data frame间比较,逻辑很烦。我把第一个data frame重新调整了一下来做,逻辑上好写。 dplyr的pipeline一直会出错,所以用了很多的for循环,但应该可以得到你要的结果

  1. library(dplyr)

  2. a=data.frame(Cntry=c('中国、美国','德国','日本、朝鲜'),
  3.              Val=c(1,6,10),
  4.              stringsAsFactors=F)

  5. b=data.frame(Cntry=c('中国','德国、法国','泰国','美国'),
  6.              Val=NA,
  7.              stringsAsFactors=F)

  8. # Function to get the value in a by country name--------------
  9. GetVal=function(Cntry)
  10. {
  11.   Val=NA
  12.   for (i in 1:nrow(a))
  13.   {
  14.     x=a$Cntry[i] %>%
  15.       strsplit(.,split='、') %>%
  16.       unlist
  17.     if(Cntry %in% x) Val=a$Val[i]
  18.   }
  19.   return(Val)
  20. }

  21. # Get an organized data frame -------
  22. a$Cntry %>%
  23.   strsplit(,split='、') %>%
  24.   unlist %>%
  25.   data.frame(Cntry_NM=.,Val=NA,
  26.              stringsAsFactors=F) -> base


  27. for(i in 1:nrow(base))
  28. {
  29.   base$Val[i]=GetVal(base$Cntry_NM[i])
  30. }

  31. for(i in 1:nrow(b))
  32. {
  33.   Ind=base$Cntry_NM %in% unlist(strsplit(b$Cntry,split='、')[i])
  34.   if(sum(Ind)>0) b$Val[i]=base$Val[Ind]
  35. }
复制代码

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

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