首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在每个数据帧行中,将每个列与另一个数据帧中的键匹配,并将新数据帧中键的值相加。

在每个数据帧行中,将每个列与另一个数据帧中的键匹配,并将新数据帧中键的值相加。
EN

Stack Overflow用户
提问于 2017-11-20 00:47:05
回答 2查看 106关注 0票数 3

我不太清楚该怎么回答我的问题。我想要做的是创建一个循环,将数据帧行中的每个值与另一个数据帧中的键匹配,并将该行的每一列中的键值相加,并将其存储在一个新的数据帧中,该数据帧的大小与键的大小相同。

用一个例子来解释应该容易得多。我是一个完全新手的R和编程,并仍在学习词汇表。

我有一个数据的词,其中每列对应于一个音素(独特的语音)。

代码语言:javascript
复制
Words_DF <- data.frame( word = c("CAT", "BAT", "APPLE"), Phoneme1 = c("K", "B", "AE"), Phoneme2 = c("AE", "AE", "P"), Phoneme3 = c("T", "T", "AH"), Phoneme4 = c("Null", "Null", "L"))

    word Phoneme1 Phoneme2 Phoneme3 Phoneme4
 1   CAT        K       AE        T       Null
 2   BAT        B       AE        T       Null
 3 APPLE       AE        P       AH        L

我有另一个数据框架,其中每个音素对应一系列二进制值。

代码语言:javascript
复制
 Phoneme_DF <- data.frame( phoneme = c("AE", "AH", "B", "K", "T", "P", "L"), is_consonant = c(0, 0, 1, 1, 1, 1, 1), is_labial = c(0, 0, 0, 0, 0, 1, 0))


   phoneme is_consonant is_labial
1      AE            0         0
2      AH            0         0
3       B            1         1
4       K            1         0
5       T            1         0
6       P            1         1
7       L            1         0

我正试图找出一条贯穿我的Words_DF每一行的方法,并在我的Phoneme_DF中的每个音素列中查找值,并将它们相加到一个新的数据框架中,该数据框架如下所示:

代码语言:javascript
复制
New_DF <- data.frame( word = c("CAT", "BAT", "APPLE"), consonants_in_word = c(2, 2, 3), labials_in_word = c(0, 1, 1))

    word consonants_in_word labials_in_word
1   CAT                  2               0
2   BAT                  2               1
3 APPLE                  2               1

我尝试过编写某种循环,遍历Words_DF的每一行,在每一行中遍历每一列,并在Phoneme_DF中查找该值,然后进行和。

代码语言:javascript
复制
   New_DF <- data.frame( word = c("CAT", "BAT", "APPLE"), consonants_in_word =      c(0, 0 , 0 ), labials_in_word = c(0, 0, 0))

  for(i in 1:length(SAMPLE_Words)){
    for(j in 1:length(where(SAMPE_Words[[j]]) %in% SAMPLE_Phoneme_DF[i])) {
    rbind(New_DF, sum(Phoneme_DF[i, ]))
   }
 }

我希望我的问题是有道理的。谢谢你的帮助!)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-20 01:27:05

我想你的输出是关的,Apple应该只有两个辅音。试试这个:

代码语言:javascript
复制
library(tidyverse)

Words_DF %>% 
  gather(value, key, -word) %>% 
  left_join(Phoneme_DF, by = c("key" = "phoneme")) %>% 
  group_by(word) %>% 
  mutate(consonants_in_word = sum(is_consonant, na.rm = TRUE),
         labials_in_word = sum(is_labial, na.rm = TRUE)) %>% 
  distinct(word, .keep_all = TRUE) %>% 
  select(word, consonants_in_word, labials_in_word)

返回:

代码语言:javascript
复制
# A tibble: 3 x 3
# Groups:   word [3]
   word consonants_in_word labials_in_word
  <chr>              <int>           <int>
1   CAT                  2               0
2   BAT                  2               1
3 APPLE                  2               1

这是我使用的数据:

代码语言:javascript
复制
Words_DF <- read.table(text = "word Phoneme1 Phoneme2 Phoneme3 Phoneme4
                               1   CAT        K       AE        T       Null
                               2   BAT        B       AE        T       Null
                               3 APPLE       AE        P       AH        L",
                       stringsAsFactors = FALSE, header = TRUE)

Phoneme_DF <- read.table(text = "phoneme is_consonant is_labial
                                 1      AE            0         0
                                 2      AH            0         0
                                 3       B            1         1
                                 4       K            1         0
                                 5       T            1         0
                                 6       P            1         1
                                 7       L            1         0",
                         stringsAsFactors = FALSE, header = TRUE)
票数 3
EN

Stack Overflow用户

发布于 2017-11-20 09:47:42

我有data.table对应的,对于任何感兴趣的人:

代码语言:javascript
复制
Phoneme_DF[melt(Words_DF,id.vars = "word", value.name = "phoneme"), on = "phoneme"][
,lapply(.SD,function(x){sum(x,na.rm = TRUE)}),
.SDcols = c("is_consonant","is_labial"),by = word]

给出

代码语言:javascript
复制
    word is_consonant is_labial
1:   CAT            2         0
2:   BAT            2         1
3: APPLE            2         1

过程类似于tyluRp提出的方法:以长格式重新构造wordDF数据表,将其与另一个数据表连接,然后逐字对辅音和下唇的值进行求和。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47383655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档