मैं एक परिभाषित कॉलम (जैसे ए 1-ए, ए 2-ए और इसी तरह) से प्रत्येक चौथे कॉलम को घटाने का एक तरीका निकालने का प्रयास कर रहा हूं, मैं इसे एक ऐसा फ़ंक्शन बनाना चाहता हूं जो विभिन्न कॉलम नामों और विभिन्न आकारों के डेटाफ्रेम के साथ काम करेगा . आदर्श रूप से यह सभी चार स्तंभों (कॉल्स ए से डी) के माध्यम से चलेगा। कोई सुझाव?

A   B   C   D   A1  B1  C1  D1  A2  B2  C2  D2
50  40  60  70  55  45  67  70  50  40  60  75
50  40  60  70  70  60  90  75  50  40  60  70
25  0   50  75  40  0   60  70  50  25  70  80

मुझे जो परिणाम चाहिए वह है:

A1  B1  C1  D1  A2  B2  C2  D2
5   5   7   0   0   0   0   5
20  20  30  5   0   0   0   0
15  0   10  -5  25  25  20  5

यह फ़ंक्शन करीब आता है (पहले और दूसरे से तीसरे कॉलम को घटाता है, फिर चौथे और 5 वें से 6 वां, और इसी तरह) लेकिन मैं यह नहीं समझ सकता कि इसे मेरी आवश्यकताओं के अनुरूप कैसे समायोजित किया जाए:

nth <- function(x,n) {
  colsA <- (1:ncol(x))[1:ncol(x)%%n!=0]
  colsB <- rep((1:ncol(x))[1:ncol(x)%%n==0], each=n-1)
  x[,colsA] <- x[,colsA] - x[,colsB]
  x
}
r
1
Peter White 24 जुलाई 2018, 00:49

2 जवाब

अगर DF इनपुट डेटा फ्रेम है (जैसा कि अंत में नोट में है) तो:

n <- 4
DF[-(1:n)] - as.matrix(DF[1:n])

देना:

  A1 B1 C1 D1 A2 B2 C2 D2
1  5  5  7  0  0  0  0  5
2 20 20 30  5  0  0  0  0
3 15  0 10 -5 25 25 20  5

ध्यान दें

Lines <- "A   B   C   D   A1  B1  C1  D1  A2  B2  C2  D2
50  40  60  70  55  45  67  70  50  40  60  75
50  40  60  70  70  60  90  75  50  40  60  70
25  0   50  75  40  0   60  70  50  25  70  80
"
DF <- read.table(text = Lines, header = TRUE)
2
G. Grothendieck 24 जुलाई 2018, 01:01

apply का उपयोग करके एक समाधान प्राप्त किया जा सकता है:

n <- 4
t(apply(df,1,function(x)x[(n+1):length(x)]-rep(x[1:n],(length(x)-n)/n)))
#      A1 B1 C1 D1 A2 B2 C2 D2
# [1,]  5  5  7  0  0  0  0  5
# [2,] 20 20 30  5  0  0  0  0
# [3,] 15  0 10 -5 25 25 20  5

एक अन्य विकल्प इस प्रकार हो सकता है:

n <- 4
df[-(1:n)] - df[rep(1:n,(ncol(df)-n)/4)]
# A1 B1 C1 D1 A2 B2 C2 D2
# 1  5  5  7  0  0  0  0  5
# 2 20 20 30  5  0  0  0  0
# 3 15  0 10 -5 25 25 20  5

डेटा:

df <- read.table(text = 
"A   B   C   D   A1  B1  C1  D1  A2  B2  C2  D2
50  40  60  70  55  45  67  70  50  40  60  75
50  40  60  70  70  60  90  75  50  40  60  70
25  0   50  75  40  0   60  70  50  25  70  80",
header = TRUE)
1
MKR 24 जुलाई 2018, 01:22