मेरे पास यह नकली डेटाफ्रेम है:

df <- structure(list(Group = c(1L, 1L, 2L, 2L), A = 1:4, B = 5:8, C = 9:12, 
X = c("A", "A", "B", "B")), class = "data.frame", row.names = c(NA, -4L))

  Group A B  C X
1     1 1 5  9 A
2     1 2 6 10 A
3     2 3 7 11 B
4     2 4 8 12 B

मैं कोशिश करता हूं एक नया कॉलम बदलने के लिए, जो उस कॉलम का मान लेना चाहिए जिसमें कॉलम का नाम किसी अन्य कॉलम में है:

वांछित आउटपुट:

Group   A   B   C   X new_col
1       1   5   9     A 1
1       2   6   10    A 1
2       3   7   11    B 7
2       4   8   12    B 7

मेरी अब तक की कोशिश:

library(dplyr)

df %>% 
  group_by(Group) %>% 
  mutate(across(c(A,B,C), ~ifelse(first(X) %in% colnames(.), first(.), .), .names = "new_{.col}"))

  Group     A     B     C X     new_A new_B new_C
  <int> <int> <int> <int> <chr> <int> <int> <int>
1     1     1     5     9 A         1     5     9
2     1     2     6    10 A         1     5     9
3     2     3     7    11 B         3     7    11
4     2     4     8    12 B         3     7    11
2
TarJae 25 पद 2021, 13:31

2 जवाब

सबसे बढ़िया उत्तर

एक विकल्प हो सकता है:

df %>%
    rowwise() %>%
    mutate(new_col = get(X)) %>%
    group_by(Group, X) %>%
    mutate(new_col = first(new_col))

 Group     A     B     C X     new_col
  <int> <int> <int> <int> <chr>   <int>
1     1     1     5     9 A           1
2     1     2     6    10 A           1
3     2     3     7    11 B           7
4     2     4     8    12 B           7
1
tmfmnk 25 पद 2021, 13:37
1
हां! across को संभालने के तरीके के बारे में सोचने के कारण, मैंने get के बारे में नया सोचा।
 – 
TarJae
25 पद 2021, 13:49
आप यहां देख सकते हैं, जहां मैंने आपका समाधान लागू किया है < stackoverflow.com/questions/70472910/…>
 – 
TarJae
25 पद 2021, 14:42

by का उपयोग करना और कॉलम चुनने के लिए समूह संख्या में + 1 जोड़ें। मान लें कि समूह कॉलम "Group" कॉलम के बाद उदाहरण के रूप में व्यवस्थित हैं।

transform(df, new_col=do.call(rbind, by(df, df$Group, \(x) 
                                        cbind(paste(x$X, x[1, x$Group[1] + 1])))))
#   Group A B  C X new_col
# 1     1 1 5  9 A     A 1
# 2     1 2 6 10 A     A 1
# 3     2 3 7 11 B     B 7
# 4     2 4 8 12 B     B 7
          

नोट: R version 4.1.2 (2021-11-01).


डेटा:

df <- structure(list(Group = c(1L, 1L, 2L, 2L), A = 1:4, B = 5:8, C = 9:12, 
    X = c("A", "A", "B", "B")), class = "data.frame", row.names = c(NA, 
-4L))
1
jay.sf 25 पद 2021, 14:39
1
यह बहुत मददगार है। धन्यवाद जय.एस.एफ.
 – 
TarJae
25 पद 2021, 14:46